1.事务:是指一组不可分割的逻辑单位,由ACID四大属性来描述
(1)原子性:是指一组sql要么全做完commit,要不就rowBack。
(2)一致性:是指事务要从一个一致性状态变为另一个一致性行状态,这里的一致性是指数据完整性和业务逻辑的一致性。
(3)持久性:是指一旦事务提交后对数据库的改变是永久性的,即使系统崩溃依然能够通过日志进行恢复。
(4)隔离性:在并发操作数据库时,其它事务不能读取到当前事务操作过程中的数据。假设A事务正在进行写操作,那么B事务只能读取到A事务修改之前的数据或者是A事务提交之后的数据。
2.由于事务的隔离性的不同可能出现以下几种问题:
(1).脏读:A事务读取到了B事务正在修改的数据(注意此时B事务还没有进行提交或者回滚)
(2).不可重复读:主要是针对delete与update这两个操作,A事务按照某个条件进行查询,此时B事务修改(delete或update)了某条数据并提交,此时A事务在去按照原来的条件去查询发现数据改变了。
(3).幻读:主要是针对insert操作,A事务按照某个条件进行查询,此时B事务插入了某条数据并提交,此时A事务在去按照原来的条件去查询发现多了行数据(这些多出来的行为幻影行)。
3.为了解决这些问题,数据库定义了几大隔离级别:
(1)读未提交:可能出现脏读,不可重复度以及幻读,这个状态隔离性最差。
(2)读已提交:解决了脏读,依然有不可重复度以及幻读。
(3)可重复度:在上一个基础上海解决了不可重复度的问题,依然存在幻读。
(4)串行化:解决了所有的问题。
4.在mysql中是通过乐观锁(MVCC)以及悲观锁来实现事务的隔离级别的。
5.在mysql的Innodb引擎中默认为可重复读级别的,在此级别通过间隙锁(GAP锁)来解决幻影行的插入。
6.可能有人会认为不可重复度与幻读好像差不多,我说一下我的理解
(1).首先我认为不可重复度与幻读的区分在于解决方法的不同。
(2).对于update或者delete来说我们只需要将符合条件的记录加锁就可以解决了,但是此时依然无法避免其它符合条件的记录插入进来。这个就是可重复度转态。
(3).对于insert操作来讲,我们还需要将符合条件的行的间隙之间加锁,才能解决幻影行的插入。