事务
原子性:事务里的操作要么全部成功,要么全部失败,undo log保证
一致性:是指数据库从一个一致性状态变到另一个一致性状态,比如a扣钱,b加钱,之后达到新的一致
隔离性:一个事务在提交或回滚前,对其他事务不可见
隔离级别:
read uncommit: 读未提交,一个事务update之后,还没有commit时,能读到update之后的数据,这个数据不准确,可能回滚,产生脏读
read commit: 不可重复读,select获取的数据,又重新select的时候,数据产生变化,由其他事务改变了
repeatable read: 可重复读,select获取的数据,又重新select的时候,数据不会产生变化,即使其他事务改变了这个数据
serializable:串行,能解决上面所有问题,但是性能低下
持久性:数据一旦提交,永久保存,redo log保证
| 事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
| 读未提交(read-uncommitted) | 是 | 是 | 是 |
| 读已提交(read-committed) | 否 | 是 | 是 |
| 可重复读(repeatable-read) | 否 | 否 | 是 |
| 串行化(serializable) | 否 | 否 | 否 |
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
理解:
脏读:读到未提交的数据
不可重复读:读到的数据不一致
可重复读:读到的数据一致,哪怕数据被其他事务修改
幻读(只针对数据条数增加):查的时候没有,插入的时候失败,因为其他事务插入了
解决方案:1,修改隔离级别为串行化 2,查的时候加行锁,select ** for update,虽然没有数据,但是行锁已存在,行锁锁定的是索引,其他事务就无法插入此索引的记录
浙公网安备 33010602011771号