在数据库操作中,为了有效保证并发读取数据的正确性,提出事物隔离并发级别。
原子性(atomicity)一致性(consistency)隔离性(Isolation)持久性(Durability)
数据库事物的隔离级别有四个:由低到高依次为 Read uncommitted、Read committed、Repeatable read、Serializable . 这四个隔离级别依次解决脏读、不可重复读、幻读这几类问题。
Read uncommitted(读未提交)出现了脏读 不可重复读 幻读
举例:两个并发事务,事务A:领导给single发工资(5000)事务B:single查询工资账户(5000开心 实际是2000),事务B在事务A提交之前读取。事务A发现出错,所以回滚。
Read committed(读提交) 避免了脏读 出现了不可重复读 幻读
举例:两个并发事务,事务A: single消费 事务B:single的老婆在网上转账 事务A读取了数据,事务B紧接着更新了数据并提交事务,事务A再次读取数据,数据发生了改变。即不可重复读。
Repeatable read 重复读 避免了脏读 、不可重复读 出现幻读
如何避免不可重复读:当single消费时,一旦系统开始读取工资卡信息(事务开启时),single老婆不可能对该记录进行修改,也就是不能转账。虽然避免了不可重复读,但是出现了幻读。
举例:事务1:single老婆在银行上班,可查看single信用卡消费信息。一天,查询到single当月的消费总额是80元(select sum(amount) from transaction where month = 本月) 事务2:single此时正在外胡吃海喝,消费了1000元,即新增了一条1000元的消费记录(insert transaction),并提交了事务。 随后single老婆打印了账单,却发现总额是1080,即出现了幻读。
举例: 事务1:删除了一条主键为1的记录,事务2:插入了一条主键为1的记录,并提交。事务1 查询数据,却发现主键为1的记录仍然在,即出现幻读。