首页 > 代码库 > mysql的事务和隔离级别详解
mysql的事务和隔离级别详解
Mysql中的事务
事务是DBMS中的执行单位,它是有限的数据库操作序列组成的。但是并不是所有的数据库操作序列都能成为事务。一般说来,事务具有如下4个特性(ACID特性):
1、原子性(Automicity):该特性引起的数据库操作"要么全部执行,要么全部不执行"。
2、一致性(Consistency):该特性表示数据库操作之前和操作之后的最终状态是一致的。比如,两个用户a,b之间相互转账,但是最终两个用户的总金额是不变的。
3、隔离性(Isolation):多个事务并发执行时,各个事务独立执行,且各个事务之间的影响最小。
4、持久性(Durability):一旦事务提交执行成功,则系统保证在任何故障下,事务都不会引起不一致性。
mysql中的脏读、不可重复读和幻读的概念
脏读:在Read-Uncommitted隔离级别下的当前事务中可以读到其他事务还没有提交的数据 。
不可重复读(non-repeatable reads):在当前事务中,且未提交,且其他事务在修改相关数据时,两次查询的结果不一样,就叫做不可重复读。
幻读:就是当前同一个事务在未提交和提交后的结果不一样。感觉像幻像一样。
mysql中隔离级别分为4种:
1、Read-Uncommited:读未提交。该隔离级别下的当前事务可以看到其他未提交事务的执行结果。在该级别下会出现脏读现象。
2、Read-Committed:读提交。解决了脏读的问题。在该隔离级别下,当前事务只能看到其他事务提交后的执行结果。因此该隔离级别支持不可重复读。大多数数据库的的默认隔离级别为Read-Committed,但是mysql不是的。
3、Repeatable-Read:重复读。解决了不可重复读的问题。在该级别且当前事务没有提交的前提下,不管其他事务如何修改数据,每次查询的结果都是一样的。一旦当前事务提交,则查询的结果就是最新的结果。因此会出现幻读的现象。事务提交前和提交后的结果不一样。在该级别下,为了提高并发能力,需要借助MVCC(多版本并发控制)机制来完成。这是mysql的默认隔离级别。
4、Serializable:可串行化。就是事务接着一个一个的串行执行,只有同一个实例下的其他事务结束后,才可以执行同一个实例下的另一个事务。这样就解决了幻读的问题。
总结:mysql的四种默认隔离级别所出现的读取方式:
1、Read-Uncommitted:会出现脏读、不可重复读等现象。
2、Read-Committed:会出现不可重复现象。
3、Repeatable-Read:会出现幻读现象。
4、Serializable:不会出现脏读、不可重复读、幻读等现象。
由此可见,隔离级别越高,所受到的干扰越小,消耗系统的资源越多。且最重要的是它们的并发性能越差。
mysql处理事务由2种方法:
1、手动执行事务
mysql>begin; 或mysql>start transaction; ##表示启动事务
mysql>rollback; ##撤销之前所做的修改(回滚)
mysql>commit; ##提交事务
2、设置事务的自动提交模式
mysql>select @@autocommit; ##查看当前事务是否是自动提交的。0或off表示关闭自动提交;1或on表示开启自动提交
set autocommit=0 ##关闭自动提交功能(只能用于当前会话,这是修改的会话变量)
set autocommit=1 ##开启自动提交功能(只能用于当前会话,这是修改的会话变量)
mysql中隔离级别的设定:
mysql>select @@tx_isolation; ##显示当前的隔离级别
mysql>set tx_isolation=‘VALUE‘ ##用来设定隔离级别
事务的执行状态:共有5种状态
1、active:表示当前事务正在进行当中
2、部分提交的:表示语句在执行过程中,由于某种原因(如宕机)导致只执行了一部分。因此事务就处于该状态下。
3、失败:表示事务没有执行成功。
4、终止:由于事务执行失败,因此系统会终止该事务
5、提交成功:表示提交后,事务执行成功。
本文出自 “linux学习之路” 博客,请务必保留此出处http://xslwahaha.blog.51cto.com/4738972/1581558
mysql的事务和隔离级别详解