zoukankan      html  css  js  c++  java
  • 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;又没有生效

  • 相关阅读:
    python 面向对象编程
    用python写个快排
    函数(参数,作用域,返回函数,匿名函数,偏函数)
    SpringBoot学习4:springboot整合listener
    SpringBoot学习1:创建第一个SpringBoot项目
    SpringBoot学习2:springboot整合servlet
    SpringBoot学习3:springboot整合filter
    使用FreeMarker导出word文档(支持导出图片)
    MySQL中实现递归查询
    MySQL中find_in_set()函数的使用
  • 原文地址:https://www.cnblogs.com/saolv/p/10285339.html
Copyright © 2011-2022 走看看