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;又没有生效

  • 相关阅读:
    题解-FJOI2014 树的重心
    题解-CF1307G Cow and Exercise
    题解-SHOI2005 树的双中心

    【转载】SVN使用教程总结
    Fastcgi、CGI 是什么
    通过js或jq增加的代码,点击事件或其他一些事件不起作用时
    js闭包讲解
    PHP 程序员危机(转载)
    浏览器 User-Agent相关知识
  • 原文地址:https://www.cnblogs.com/saolv/p/10285339.html
Copyright © 2011-2022 走看看