1. 隔离性有隔离级别(4个):
隔离级别 | 默认级别(数据库) | 隔离 | 解决的问题 | QA | 导致的问题 |
读未提交, read uncommitted |
读取到其他事务的中间状态, 若其他事务回滚则会读取到垃圾数据 |
||||
读已提交, read committed |
MsSQL, Oracle |
对写操作隔离 |
解决脏读问题 |
Q: 其他事务读取是否受影响 A: 不受影响 |
导致不可重复读问题 |
可重复读 repeatable read |
mySQL |
对读操作隔离 一次事务中只在第一次select时 生成快照 |
解决不可重复读问题 |
Q: 其他事务是否可以增删改 A: Yes |
导致幻读问题 |
串行化 serializable |
解决幻读问题 | 导致并发问题 |
2..锁
共享锁允许加其他共享锁,
排它锁不允许加其他任何锁.
insert、delete和update都是会加排它锁(Exclusive Locks)的,
select默认不加锁(也可以加共享锁or 排它锁),排他锁会阻止其它事务再对其锁定的数据加读或写的锁,但是对不加锁的读就不起作用了。
3.测试-锁:
窗口1:
1 START TRANSACTION; 2 select * from account where id = 121 lock in share mode; 3 -- COMMIT
窗口2:
1 START TRANSACTION; 2 select * from account where id = 121 for update; 3 -- COMMIT
窗口3(查看锁的记录)
1 SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; 2 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 3 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;