事务的特性
众所周知的:ACID
A(atomicity)原子性
事务不可分割,共同成功或失败
C(atomicity)一致性
事务执行后,数据的完整性保持一致
I(atomicity)隔离性
事务互不干扰
D(atomicity)持久性
事务执行后数据就持久化到数据库
并发事务可能导致的问题
脏读
一个事务读到另一个事务更新但未提交的数据(回滚)
不可重复读
一个事务的两次查询中间有一个事务对数据做了更改,两次查询数据不同
幻读
一个事务根据条件更新全表,但是另一个事务又插入一条数据,第一个事务发现插入的数据没更新,就像出现了幻觉一样
事务的隔离级别
读未提交(Read uncommitted):读取未提交的数据,只解决更新丢失问题
读已提交(Read committed):读取已经提交的数据,所以可以解决脏读问题。读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据
可重复读(Repeatable read):解决脏读和不可重复读问题,在这个事务还没结束时,其他事务不能访问该数据(包括了读写)
串行化(Serializable):事务只能一个接着一个地执行,但不能并发执行,解决所有问题,但是阻塞,效率低下!
那么我们就发现,除了效率低下的串行化,没有可以解决幻读问题的!那么,我们在平时的数据库使用中,是怎么解决幻读问题的。
如何解决幻读?
MVCC
多版本并发控制解决了基于快照读下的幻读
Next-Key Lock
Next-Key Lock是间隙锁加行锁,很好的解决了当前读下的幻读。