• mysql事务


    一个事务,不管是commit还是rollback都表示这个事务的结束

    一个表:

    mysql> select * from bb;
    +----+------+
    | id | b |
    +----+------+
    | 1 | 1000 |
    | 2 | 2000 |
    +----+------+

    假如我们开启了两个终端,一个终端先执行以下操作:

    mysql> update bb set b=900 where id=1;
    Query OK, 1 row affected (0.05 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)

    mysql> update bb set b=b-900 where id=1;
    Query OK, 1 row affected (0.02 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    然后在另一终端执行以下操作:

    mysql> update bb set b=7000 where id=2;
    Query OK, 0 rows affected (0.09 sec)
    Rows matched: 1 Changed: 0 Warnings: 0

    mysql> select * from bb;
    +----+------+
    | id | b |
    +----+------+
    | 1 | 1000 |
    | 2 | 7000 |
    +----+------+
    2 rows in set (0.01 sec)

    这时你还看不出什么,接下来就要注意了,还是在这个终端,执行:

    mysql> update bb set b=5000 where id=1;

    我们会看到当前终端被阻塞,原因是,id=1的这一行,正在被另一个终端的事务中执行,且这个事务还没有结束。那么就相当于这一行有一把锁,除非这个事务结束了,这个锁才能消失

    于是,我们回到第一个终端,执行commit;

    此时第二个终端才不被阻塞,当前的语句才被执行,最后查看id为1的行,b的值,发现是5000(注意先后顺序,不是4100)

    当然,被阻塞的终端二也会有一个等待时间,如果超出了等待时间,则跳过阻塞(阻塞的语句也就没执行成功。就好比上面这个例子,如果我们等了很久才在第一个终端commit,那么最后查看id为1的行的b是100,因为1000-900=100,而update bb set b=5000 where id=1;又没有生效

  • 相关阅读:
    jquery源码 DOM加载
    用 Vue 全家桶二次开发 V2EX 社区
    java中初始化对象变量的方法
    跟我一起学extjs5(08--自己定义菜单1)
    NYOJ 57 6174问题
    Android 手动按power键上锁,没有锁屏提示音,无法恢复【单机必现】
    说好的加班呢
    排序总结之高速排序
    【c语言】模拟实现库函数的atof函数
    Oracle存储过程update受外键约束的主键值时完整性冲突解决方式
  • 原文地址:https://www.cnblogs.com/saolv/p/10285339.html
Copyright © 2020-2023  润新知