随笔分类
并发控制
当程序中可能出现并发的情况时,就需要通过一定的机制手段来保证并发情况下数据的准确性。
通过这种手段来保证当多个用户并行操作时,得到的数据与他单独操作时的结果是一样的
称这种手段为并发控制
目的便是为了保证别的用户的工作不会对另一个用户的工作产生任何不合理的影响
不良数据
如果没有做好并发控制的话,那么得到的数据就有可能是以下几种
-
脏数据 读取了没有提交的数据
A事务读取B事务已经修改了但还未提交的数据,如果B事务发生了错误并执行回滚操作,那么A事务读取的数据便是脏数据。
就好比原来的数据时干净纯粹的,但是事务B修改了这些数据但还没提交,这些数据就变肮脏了,此时事务A读取了这些脏数据,但之后事务B突然良心发现,痛改前非,又回滚把数据恢复成原来干净纯粹的状态
但是事务A已经读取了数据,并且他也不知道他所读到的数据时不干净的,这便是脏数据
这种情况多发生在银行转账与取款中
时间顺序 | 转账 | 取款 |
---|---|---|
1 | 开启事务 | |
2 | 开启事务 | |
3 | 查询账户有2500元 | |
4 | 取款1000元,余额被修改为1500 | |
5 | 查询数据1500(此时是脏数据) | |
6 | 取款操作发生错误,事务回滚,余额变为2500元 | |
7 | 转入2000元,此时余额被修改为3500(2000+1500) | |
8 | 提交事务 | |
9 | 按照正常逻辑,此时账户余额应该为4500元 |
-
幻读
一个事务在前后两次查询同一范围时,后一次查询看到了前一次查询没有看到的记录
即前后多次读取,数据记录的总量发生了变化
事务A在执行读取操作过程中,需要多次统计数据记录的总量
如果先后读取发现数据记录的总量发生了变化,如同之前获取的数据时鬼影一般,这便是幻读
- 幻读专指新插入的行,读到原本存在的记录的更新结果并不算(这其实是不可重复读)
-
不可重复读
在数据库访问中,一个事务范围内两个相同的查询缺返回来不同的数据
这是由于查询时系统中其他事务的修改的提交而造成的。
说白了就是前后多次读取,记录的数值发生了变化
比如说A事务需要先后读取同一记录的数据,时间跨度稍微有点长,在此期间B事务读取了该记录的数据并进行了修改,当A事务再次进行该记录数据的读取时,发现该记录的数据已经发生了更改(并非是指记录的行数增加了!那是幻读),这便是不可重复读