首页 > 代码库 > 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的事务和隔离级别详解