mysql事物

  事物:一组原子性的sql操作,是一个独立的操作单元,这些sql要么全部执行成功 要么全部执行失败。

  事物的特性:ACID

  A 原子性:一个事物是最小的的单元,整个事物要么全部成功,要么全部失败,不可能部分成功

  C 一致性:数据库总是从一个一致性状态转换到另一个一致性状态,

  I 隔离型:一个事物在提交之前对其他事物是不可见的。是有隔离性的,具体参照下面的事物隔离级别。(隔离性的另一层含义是否是将数据库表阻塞?答案否 串行化才会这样)

  D 持久性:一旦事物提交,则其数据将会持久化到数据库中,

  事物的隔离级别

每一种隔离级别都规定了事物中所作的修改 哪些在事物内和事物间是可见的,哪些是不可见的,隔离级别和并发能力通常是成反比例的。

  read uncommited:未提交读(脏读),这种级别即使事物未被提交,对其他事物也是可见的,实际生产中,一般不会这么设置

  read commited:提交读,大多数的数据库默认隔离级别都是这个级别(但是mysql不是)这个级别满足上面的隔离性的定义,即一个事物在提交之前对其他事物是不可见的,这个级别也叫不可重复读,因为两次重复的查询所得到的结果可能是不一样的(事物提交前和提交后)。

  repeatable read:可重复读,当前级别也是mysql的默认隔离级别,该级别保证了同一个事物内的多次查询结果是一致的(能保证一个事务内的多次读取结果是一致的,即使其他事务已经修改了数据,后开启的事务不能读取到其他事务未提交的结果)

  但是理论上当前级别还是无法解决另一个幻读的问题,所谓幻读,是指事物在读取某个范围内的记录时,另一个事物又在该范围内插入新的数据,当前事物再事物再次读取该范围内的记录时,会产生幻行。下面演示幻读

新建test表并加入数据

开启事物1并查询,开启事物2并查询。

 

在事物2新增数据并提交事物2   insert into test (id,name) values(3,3);

此时在事物1也进行相同的插入操作

insert into test (id,name) values(3,3);

插入不进去 但是再次查询却显示不存在3,3,这就幻读现象。

  serializable:可串行化,是事物的最高的级别(类似于单线程),强制事物串行执行,可以避免幻读的问题,serializable会在读取的每一行都加锁,会导致严重的性能问题,实际应用基本不会使用该级别。

  数据库死锁:两个或多个事物在同一资源上相互占用,并互相请求对方所占用的资源,从而导致死锁现象。InnoDB目前处理死锁的方法是将持有最少行级排他锁的事物进行回滚。

  mysql的自动提交:就是说如果不显示指定的开启一个事物(如上面的begin命令)那么在自动提交开关打开的情况下每一个sql都当做一个事物进行提交,可以通过SHOW VARIABLES LIKE 'AUTOCOMMIT'; 查看自动提交状态 SET AUTOCOMMIT =0; 设置开关状态

  对于MyISAM和内存表来说,不存在commitrollback的概念 也就是相当于AUTOCOMMIT 一直处于启动模式。

  需要注意的是假设在事物中使用事务性和非事物性的表(如InnoDBMyisam),正常提交情况下是不会出现问题的,但如果事物需要回滚。非事物表无法撤销 这种情况是很难处理的,事物的最终状态无法确认,所以统一存储引擎很有必要,

原文地址:https://www.cnblogs.com/tjqBlog/p/9450439.html