为了操作方便,数据库为我们设置了4种事务隔离级别,不同级别数据库有不同的加锁策略,对我们来说是透明的。我们根据实际情况,权衡并发性和隔离性进行选择。
隔离级别 | 是否出现第一类丢失更新 | 是否出现脏读 | 是否出现虚读 | 是否出现不可重复读 | 是否出现第二类丢失更新 |
Serializable | 否 | 否 | 否 | 否 | 否 |
RepeatableRead 可重复读 | 否 | 否 | 是 | 否 | 否 |
ReadCommited 读已提交数据 | 否 | 否 | 是 | 是 | 是 |
ReadUcommited 读未提交数据 | 否 | 是 | 是 | 是 | 是 |
Serializable完全看不到其他事务所作的更新。
RepeatableRead可以看到其他事务已经提交的新插入记录,但是不能看到其他事务对已有记录的更新。
ReadCommited可以看到其他事务已经提交的新插入记录,也能看到其他事务对已有记录的更新。
ReadUcommited可以看到其他事务未提交的新插入记录,也能看到其他事务对已有记录的未提交更新。
一般数据库默认ReadCommited,已经可以满足大部分需要了。能够避免脏读和有较好的并发性,但是也有一些并发的问题,可以通过应用程序的悲观锁和乐观锁来规避。