事务隔离级别

ANSI/ISO SQL标准定义了4种事务隔离级别,这些隔离级别是根据事务并行出现的4个“现象”定义的。

 

4个现象是:

1.更新丢失(Lost Update):A和B同时写

例:
1.事务A将数值改为1并提交;
2.事务B将数值改为2并提交。
这时数据的值为2,事务A所做的更新将会丢失。

解决办法:对行加锁,只允许并发一个更新事务。

2.脏读(dirty read):A改后还未提交,B读,A又改并提交

例:

1.Mary的原工资为1000, 财务人员将Mary的工资改为了8000(但未提交事务)
2.Mary读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!
3.而财务发现操作有误,回滚了事务,Mary的工资又变为了1000, 像这样,Mary记取的工资数8000是一个脏数据。


3.不可重复读(nonrepeatable read):A先读,B再改,A再读

例:

1.在事务A中,Mary 读取了自己的工资为1000,操作并没有完成
2.在事务B中,这时财务人员修改了Mary的工资为2000,并提交了事务.
3.在事务A中,Mary 再次读取自己的工资时,工资变为了2000
解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。

4.幻读(phantom read):A改后还未提交,B改其他的,A再查

例:

1.A把所有的“黑色”改为“白色”

2.B把所有的“红色”改为“黑色”

3.A再查询黑色,却发现还有一批。

 

根据对4个现象的避免程度,事务的4个隔离级别是:

 

  • 1.Read Uncommited :读未提交数据(会出现脏读,不可重复读,幻读)
  • 2.Read Commited :读已提交的数据(会出现不可重复读,幻读)
  • 3.Repeatable Read :可重复读(会出现幻读)
  • 4.Serializable :串行化

 

四个级别与四种现象的关系是:

英文

中文

更新丢失

脏读

不可重复读

幻读

Read Uncommited

读未提交

不会出现

会出现

会出现

会出现

Read Commited

读已提交

不会出现

不会出现

会出现

会出现

Repeatable Read

可重复读

不会出现

不会出现

不会出现

会出现

Serializable

串行化

不会出现

不会出现

不会出现

不会出现

 

大多数数据库的默认隔离级别为: Read Commited,如Sql Server , Oracle。

少数数据库默认的隔离级别为Repeatable Read, 如MySQL InnoDB存储引擎。

posted @ 2012-05-13 17:11  hollen  阅读(3022)  评论(1编辑  收藏  举报