数据库事务与隔离事例
?
大家都知道,数据
库
事
务
的四大特性
ACID
(
Atomic, Consistency, Isolation, Durability
),
这
里主要考
虑
一致性和隔离性。
为
了提高事
务
的
处
理效率,通常并
发
的
执
行多个事
务
,
这
就是数据
库
中非常重要的
‘
并
发
控制
’
。
简单
说
,并
发
的
执
行事
务
,会有以下
问题
:
-
写
丢
失(Write
Lost)
:比如事
务
A
将x
的
值
更新
为
10
,然后事
务
A
将y
的
值
更新
为
20
,
这时
A
重新
读
取x
发现
自己更新
过
的数据似乎不
见
了。
-
脏读
(Dirty Read)
:比如事
务
A
的未提交(
还
依然
缓
存)的数据被事
务
B
读
走,如果事
务
A
失
败
回
滚
,会
导
致事
务
B
所
读
取的的数据是
错误
的;
-
不可重复
读
(Non-repeatable Read)
:比如事
务
A
中两
处读
取数据
total
的
值
。在第一
读
的
时
候,
total
是
100
,然后事
务
B
就把
total
的数据改成
200
,事
务
A
再
读
一次,
结
果就
发现
,
total
竟然就
变
成
200
了,造成事
务
A
数据混乱。
-
幻象
(Phantom Read)
:和
Non-Repeatable Read
相似,也是同一个事
务
中多次
读
不一致的
问题
。但是
Non-Repeatable Read
的不一致是因
为
他所要取的数据集被改
变
了(比如
total
的数据),但是
Phantom Read
所要
读
的数据的不一致却不是他所要
读
的数据集改
变
,而是他的条件数据集改
变
。比如
Select account.id where account.name="ppgogo*",
第一次
读
去了
6
个符合条件的
id
,第二次
读
取的
时
候,由于事
务
b
把一个
帐
号的名字由
"dd"
改 成
"ppgogo1"
,
结
果取出来了
7
个数据。