由高到低分别是
- serializable:在同一个tx内部,select 到数据的时候加读锁和写锁 range-locks 在 where 选中的范围上,直到 tx 结束。否则的话, 会出现 phantom reads —— 一个tx内部两个同样的查询,如果中间混入了另外一个 tx 的插入,则两个查询的结果会不一样。
- repeatable reads:select 到数据的时候加读锁和写锁。然而,读锁和写锁只会加在行上不会加在 range 上,会有 phantom reads。
- read committed:在select的时候加写锁,写锁跟着tx走,读锁在select之后就放开了。两个交叉的 tx,只要写的 commit了,甭管tx内部同样的读会不一致,以最新的结果为准。
- read uncommitted:dirty reads not-yet-committed data
The default isolation level for InnoDB
is REPEATABLE READ
数据库的读锁和写锁的概念似乎和 JAVA 的 ReentrantLock 读写锁的概念不一样?