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

 

posted @ 2019-01-17 22:37  扫驴  阅读(151)  评论(0编辑  收藏  举报