- 事务的并发问题
1、脏读
所谓脏读,就是一个事务读到了别的事务回滚前的脏数据,比如事务B执行过程中修改了数据X,在未提交前(即未保存到数据库前),事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读。
2、不可重复读
所谓不可重复读,就是指在一个事务多次读取同一数据,读出来的数据不一致。比如库存数为100,事务A读取库存数为100,切换到事务B事务B开启事务–>事务B减库存50–>提交,数据库里面库存变为50元,此时切换回事务A,事务A再查一次查出库存为50,这样对事务A而言,在同一个事务内两次读取账户余额数据不一致,这就是不可重复读。
3、幻读
比如系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
- 不可重复读注重的是数据数值发生变化,幻读侧重数据条数发生变化.
- 事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
---|---|---|---|---|
Read Uncommitted(读取未提交内容) | 是 | 是 | 是 | 否 |
Read Committed(读取提交内容) | 否 | 是 | 是 | 否 |
Repeatable Read(可重复读) | 否 | 否 | 是 | 否 |
Serializable(可串行化) | 否 | 否 | 否 | 是 |
解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表