数据库事务的四大特性 以及事务并发引起的问题教程
ACID
- 原子性(Atomic):事务包含的所有操作,要么全做,要么全不做回滚;
- 一致性(Consistency):从一个一致状态到另一个一致状态;eg:A、B之间转账,两者的金额总和转账前后必须相同。
- 隔离性(Isolation):多个事务并发执行时,不会相互影响。
- 持久性(Durability):一个事务一旦修改,它对数据库的修改应该永久存在数据库中。
事务隔离
事务并发引起的问题以及如何避免
- 更新丢失——mysql所有事务隔离级别在数据库层面均可避免。
- 脏读——READ-COMMITTED事务隔离级别以上可以避免。(未提交的事务修改的数据也能读取到而引起的错误数据,RC级别以上可避免)
- 不可重复读——REPETABLE-READ事务隔离级别以上可避免。(加锁后读取的数据会因为其他事务操作而变化,RR级别以上可避免)
- 幻读——SERIALIZABLE事务隔离级别可避免。
oracle默认read-committed,mysql默认repetable-read。
幻读:是指当事务不是独立执行时发生的一种现象。
例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样.一般解决幻读的方法是增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读。
针对当前读,RR隔离级别保证对读取到的记录加锁 (记录锁),同时保证对读取的范围加锁,新的满足查询条件的记录不能够插入 (间隙锁),不存在幻读现象。