锁机制
共享锁
多个共享锁可以共存,但是已经加了共享锁就不能再加排他锁
排他锁
只要加了排他锁,那么就不能加其他锁
隔离级别
- 未提交读 Read uncommitted
- 已提交读 Read committed
- 可重复度 Repeatable read
- 串行化 Repeatable read
未提交读
读时不加锁,写时加排他锁。
问题:造成脏读,即读取未提交的事务。
问题原因:写数据时有排他锁,但是读数据没有共享锁,所以不会产生共享锁和排他锁的冲突,从而可以读取未提交数据。
已提交读
读时加共享锁,写时加排他锁,但是读取完成就会释放共享锁。
问题:不可重复读,即同一次事务中,多次读取同一数据结果不相同。
问题原因:因为读取后即释放共享锁,此时数据可以被其他事务加排他锁,然后修改,这样原事务再次读取就会发现数据不同了。
可重复读
读时加共享锁,写时加排他锁,且读取完成就不会释放共享锁,直到事务结束释放锁。与已提交读的区别在于,事务结束后才释放共享锁。也是mysql默认的事务隔离级别。
问题:幻读。读取数据虽然加锁,但是此时可以插入新数据,而新数据不受之前共享锁的影响,此时再次读取,会发现前后数据不一致。同不可重复读的区别在于,幻读主要时由于插入或删除新数据导致,或者说幻读发生在不同的行,而不可重复读发生在同一行。
问题原因:新插入的数据,不受之前读取数据共享锁的影响。
串行化
读时加共享锁,写时加排他锁,不过前3个都是行级锁,而串行化是表级锁。这样所有的数据表的写入操作,就只能有一个事务,这样可重复读的问题也解决了,保证了串行化。