并发控制
并发优点
为什么要并发,或者说并发有什么好处?
1、并发可以改善CPU等资源的资源利用率,提高系统效率。(这里类比操作系统,有些进程在等待IO的时候,可以把CPU让出来给别的进程用)
2、不同事物可能访问数据库的不同内容,这样可以提高数据库的利用率。(数据库里面那么多表,一个事物也就访问几个或者十几个,不并发太浪费了些)
三大并发问题
刚刚说了并发的好处,在提到第二个好处的时候,对于“访问数据库不同的内容”,如果两个事物访问数据库的内容有交叉怎么办?以下图为例:
因此在并发过程中会遇到并发冲突的问题,只有解决好了这些问题,并发才能较为顺利的完成。
- 1、
丢失修改
——写-写冲突 - 2、
读脏数据
——写-读冲突 - 3、
不可重复读
——读-写冲突
接下来分析一下这三个并发问题:
- 1.丢失修改。也就是说:其中一个事物对数据库的修改会被另一个并发事务覆盖,从而导致这个事务所作的修改被覆盖了。举个例子:
事务T1 | 事务T2 |
---|---|
Read(x) | … |
… | Read(x) |
x = x+2 | … |
… | x = 5*x |
write(x) | … |
… | write(x) |
假设x的初值为6,事务T1修改完x之后,x的值为8,之后被写回到数据库中。但是刚写回数据库,就被事务T2计算的x结果30覆盖了,就好像T1这个事务啥都没干一样。
- 2、读脏数据。所谓读脏数据,就是读取正在更新的数据。因为事务在进行一半的时候,很有可能因为故障或者因为其他原因要进行回退的,如果另一个事务T2读了事务T1正在更新的数据,就会因为T1的回退而产生多米诺效应,也要跟着回退。举个例子:
事务T1 | 事务T2 | 事务T3 |
---|---|---|
… | … | … |
write(x) | … | … |
… | read(x) | … |
… | y = x+1 | … |
… | write(y) | … |
… | … | read(y) |
… | … | z = y+2 |
… | … | write(y) |
故障 -> RollBack< |