简述
当多个事务在操作同一套数据源时,事务会彼此影响。根据这些事务之间的影响程度的不同,我们将其划分为多个隔离级别。隔离级别越低,事务所受到的限制就越低,性能相对会提高些,但是所造成的数据异常情况也相对多些。
数据异常
数据异常有以下几种情况:
(1)脏读:在事务A读取了事务B尚未提交的更新数据,此时事务B由于各种异常情况回滚了。
事务A | 事务B |
---|---|
X=100 | |
更新X=200 | |
读取x=200 | |
发生错误,进行回滚 | |
X错误 |
(2)不可重复读:无论其他事务是否提交,只要本事务都不曾提交,那么该事务下对同一笔数据的读取理应是一样的,否则则为不可重复读现象。
事务A | 事务B |
---|---|
X=100 | |
X=100 | |
写入X=200 | |
X=200 | |
X发生错误 |
(3)幻读:无论其他事务是否提交,本事务的查询都应该是一个相同的结果集。否则则为幻读。幻读更倾向于新增或者删除数据。
事务A | 事务B |
---|---|
查询列表[a,b,c] | |
插入d,并提交 | |
查询列表[a,b,c,d] | |
X发生错误 |
(4)丢失更新
事务A | 事务B |
---|---|
X=100 | X=100 |
更新X=200 | |
更新X=300 | |
重新读取X X为300 | |
发生错误 |
注意
这些隔离级别由低到高依次为:ReadUncommitted,ReadCommitted,Repeatable Read以及Serializable
一般来说,ReadCommitted用的比较多,之后则是Repeatable Read。