高性能MySQL之事务(3)

高性能MySQL事务:

概念:事务是一组原子性的sql查询,一个独立的工作单元。事务内的语句要么全部执行成功,要么全部执行失败。

银行转账是解释事务重要性的一个经典例子。比如:客户A要向客户B转账200元,需要三个步骤:

1,检查A账户是否够200元。

2,A账户减200元。

3,B账户增加200元。

这三个步骤必须打包在一个事务中,任何一个步骤失败,则必须回滚所有的步骤。

空谈事务的概念是不够的,事务还得必须具备ACID四个标准特征。

 (1)原子性(atomicity)

          一个事务被视为一个最小的工作单元,整个事务中的操作要么全都执行成功,要么全部或失败回滚。这就是事务的原子性。

(2)一致性(consistency)

         事务执行前后,数据库中的数据是从一个一致状态转换到另外一个一致状态。

(3)隔离性(isolation):

        隔离性是当多个客户同时访问统一数据库时,比如访问同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发的事务之间要相互隔离。()()

(4)持久性(durability)

         持久性是指一个事务一旦提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失事务提交的数据。


 下面介绍事务的四种隔离级别:

1)未提交读(READ UNCOMMITTED)

    事务中的修改,即使没有提交,对其他事务也是可见的。事务可以读取未提交的数据,这样也被称为赃读。

2)提交读(READ COMMITTED)

     大多数的数据库系统的默认隔离级别是未提交读(MySQL不是)。事务所做出的修改,提交之后对齐他事务才是可见的。这个级别可能导致一个事务多次读取同一数据,得到不同的结果,是因为在第一次和第二次读取之间其他事务修改了这一数,导致第二次读取的结果和第一次读取的结果不一致。所以这个级别有时候也叫做不可重复读。

3)可重复读(REPEATABLE READ)

     该事务解决了赃读和不可重复读的问题,但是不能解决另外一个幻读的问题。所谓幻读指的是,当某个事务在读取某一范围的数据时,另外一个事务又在该范围插入了新的记录,当之前的事务再次读取这一范围的数据是,会产生幻行。

     InnoDB和XtraDB存储引擎通过多版本并发控制解决了幻读的问题。

4)可串行化(SERIALIZABLE)

可串行化是最高的隔离级别。他通过强制事务串行执行,避免了幻读的问题。简单来说,可串行化会在读取的每一行数据上加锁,所以可能导致大量的超时和锁争用的问题,实际应用中也很少用到这个隔离级别。


 
原文地址:https://www.cnblogs.com/tongluo/p/5851805.html