mysql事务

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操作来讲,我们还需要将符合条件的行的间隙之间加锁,才能解决幻影行的插入。

posted @ 2019-04-21 17:31  神奇海螺。  阅读(138)  评论(0编辑  收藏  举报