MySQL 事务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 事务相关的知识,希望对你有一定的参考价值。

银行引用是事务的一个经典例子:假如银行有两张表,一张支票表,一张储蓄表,现在需要从Jones用户的支票账户转移200¥ 至储蓄账户,那么至少需要三步:
    1. 检查Jones的支票账户余额是否大于200¥
    2. Jones的支票账户-200¥
    3. Jones的储蓄账户+200¥
上述三步可组成一个事务,当2、3步故障时,之前执行的操作会自动回滚,保证数据的一致性。

    

一、mysql事务

MySQL事务是一组SQL语句或一个独立运行的工作单元并且满足ACID测试。
    
ACID测试:
    A.atomicity,原子性,一个事务必须作为不可分割的最小单元,事务中的语句要么都执行成功,要么都执行失败。
    C.consistency,一致性,数据库总是从一个一致性状态到另一个一致性状态(数据库的结果是一致的,所有事务中SQL语句共同修改后的结果)不可能因为系统奔溃出现上述支票表-200¥而储蓄表未+200¥,未提交的事务并不会保存至数据库中。
    I. isolation ,隔离性,当前事务操作过程对于另一个线程事务的可见度,由隔离级别决定。
    D. durability , 持久性 , 所有事务提交后都永久存放于数据库中。
    
    

隔离级别:
    1. READ UNCOMMITTED (读未提交)
    2. READ COMMITTED(读提交)
    3. REPEATEABLE READ(可重复读)
    4. SERIALIZABLE(序列化)
    
各个隔离级别可能产生的问题:
    a.脏读,可以读取另一个线程事务未提交修改的数据。
    b.不可重复读,当前事务多次读取(查询)的结果不一致。
    c.幻读,当别的线程事务修改数据提交后,本线程未操作数据,但本事务提交后数据将改变,这就是幻读。
当别的线程事务修改数据提交后,本线程看到的数据未改变,本事务提交后数据将改变,这就是幻读。
    d.加锁读,你懂得。
技术分享图片
事务相关的命令:

        START   TRANSACTION                        #开启事务
        ROLLBACK                                             #回滚事务
        COMMIT                                                  #提交事务
        SAVEPOINT identifier                              #事务语句过多时,可以创建一个保存点,单独还原至此点
        ROLLBACK [WORK] TO [SAVEPOINT] identifier                     #还原事务至此点
        RELEASE SAVEPOINT identifier                                              #删除保存点

二、验证各事务隔离级别存在的问题:

 
1. READ UNCOMMITTED
a.首先需要关闭事务自动提交功能
技术分享图片
b.修改事务隔离级别为READ-UNCOMMITTED
技术分享图片
c.开启事务功能
技术分享图片
d.在一线程事务中修改数据但不提交,在另一线程查看数据已更改,这就是脏读,存在脏读就必然存在不可重复读、幻读问题。
技术分享图片
2. READ COMMITTED
a. 修改事务级别为 READ-COMMITTED .
技术分享图片
b. 开启事务,并在一线程中删除数据,另一线程查看发现数据已更改,这就是不可重复读。
技术分享图片
技术分享图片

  1. REPEATEABLE READ
    MySQL采用间隙所防止幻读,插入数据时被锁定了,无法演示。
    技术分享图片

  2. SERIALIZABLE

以上是关于MySQL 事务的主要内容,如果未能解决你的问题,请参考以下文章

基础-事务

理解片段事务期间片段的生命周期方法调用

提交带有全屏片段的片段事务

使用 OnItemClickListener 列出视图片段到片段事务

Android中的片段事务问题

Android从后台堆栈中删除事务