mysql的锁定机制
九 08
SET AUTOCOMMIT=0;设置所有的事务都不会自动提交。
如果没有设置,可以临时用START TRANSACTION来开始事务,这样开始的也不会自动提交,直到这个事务结束。
普通的,用begin开始。
这是一个实验:
CREATE TABLE t (i INT) ENGINE = InnoDB;
START TRANSACTION
在A客户端检索SELECT * FROM t;
结果empty
在B客户端INSERT INTO t VALUES (1, 2);
在A客户端检索SELECT * FROM t;
结果empty (因为B客户端还没有提交)
在A客户端检索SELECT * FROM t LOCK IN SHARE MODE
线程等待B客户端提交
在B客户端commit
A客户端返回
———————
| 1 | 2 |
———————
1 row in set
在A客户端检索SELECT * FROM t
结果empty (因为A客户端还处在事务中,由此可见事务对于select的影响)
在A客户端commit
在A客户端检索SELECT * FROM t
A客户端返回
———————
| 1 | 2 |
———————
1 row in set
结论
- LOCK IN SHARE MODE可以绕过本session事务的限制,读取最新的,已经被commit的结果,但是如果有没有commit的部分,就会加入等待列队
- 事务对于select也是有很多影响的
RSS
近期评论