事务

Posted saxon宋

tags:

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

事务

  • 什么是事务?

    要么都成功,要么都失败

  • 事务原则: ACID原则性 一致性,隔离性,持久性 (脏读,幻读)

    原子性(Atomicity)

    要么都成功,要么都失败

    一致性(Consistency)
    事务前后数据的完整性必须保持一致。

    持久性(Durability) —- 事务提交

    事务一旦提交则不可逆,被持久化到数据库中!

    隔离性(Isolation)

    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离

  • 隔离所导致的一些问题

    脏读:

    指一个事务读取了另外一个事务未提交的数据。

    不可重复读:

    在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)

    虚读(幻读)

    是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。(一般是行影响,多了一行)

  • 执行事务

    -- ========== 事务 ==========
    -- mysql 是默认开启事务自动提交的
    SET autocommit = 0 /*关闭*/
    SET autocommit = 1 /*开启(默认的)*/
    -- 手动处理事务
    SET autocommit = 0 -- 关闭自动提交
    -- 事务开启
    START TRANSACTION    -- 标记一个事务的开始,从这个之后的sql都在同一个事务内
    INSERT xx
    INSERT xx
    -- 提交: 持久化
    COMMIT
    -- 回滚: 回到原来的样子(失败!)
    ROLLBACK
    -- 事务结束
    SET autocommit = 1 -- 开启自动提交
    -- 了解
    SAVEPOINT 保存点名 -- 设置一个事务的保存点
    ROLLBACK TO SAVEPOINT 保存点  -- 回滚到保存点
    RELEASE SAVEPOINT 保存点  -- 撤销保存点
    
    流程图

模拟场景

  • -- 转账
    CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
    USE shop
    CREATE TABLE `account`(
        `id` INT(3) NOT NULL AUTO_INCREMENT,
        `name` VARCHAR(30) NOT NULL,
        `money` DECIMAL(9,2) NOT NULL,
        PRIMARY KEY (`id`) 
    )ENGINE=INNODB DEFAULT CHARSET=utf8
    INSERT INTO account(`name`,`money`)
    VALUE (\'A\',2000.00),(\'B\',10000.00);
    -- 模拟转账: 事务
    SET autocommit = 0;   -- 关闭自动提交
    START TRANSACTION -- 开启一个事务
    UPDATE account SET money=money-500 WHERE `name` = \'A\'  -- A减500
    UPDATE account SET money=money+500 WHERE `name` = \'B\'  -- B加500
    COMMIT; -- 提交事务,就被持久化了!
    ROLLBACK; -- 回滚
    SET autocommit = 1; -- 恢复默认值
    

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

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

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

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

Android中的片段事务问题

Android从后台堆栈中删除事务

android 片段事务