ACID中的字母I(Isolation,隔离)并不是完全需要。处于性能的原因,可以降低隔离要求,但必须了解隔离级别带来的问题。
如果不完全隔离事务外部的作用域,就可能出现以下问题。
- 脏读—在脏读操作中,另一个事务可以读取在一个事务中改变的记录。因为一个事务中的改变的记录可能回滚到最初的状态,所以从另一个事务中读取这个临时状态就称为“脏读”–数据并没提交。通过锁定要改变的记录,就可以避免这个问题。
- 不可重复读–当数据在事务中读取,而该事务运行的同时,另一个事务修改了相同的记录。此时,就会出现了不可重复操作。如果该记录在事务中读取多次,结果就会不同,—不可重复。锁定读取的记录,即可避免。
- 幻读–当读取一个范围内的数据,例如,使用where子句读取时,就会出现幻读问题。在一个事务中读取这些记录时,另一个事务可以添加一个属于该范围的新记录。用相同的where子句再次读取这些记录,会返回不同的记录。幻读一般出现在更新一个范围的记录时。
在定义隔离要求时,可以设置隔离级别。隔离级别IsolationLevel枚举定义,在创建事务时,会配置该枚举。
事务隔离级别可能导致的问题