zoukankan      html  css  js  c++  java
  • 事务管理(ACID)

    本文转自:https://blog.csdn.net/dengjili/article/details/82468576

    一、事务管理(ACID)

    原子性(Atomicity)
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

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

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

    持久性(Durability)
    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

    原子性(Atomicity)

    针对同一个事务

    这个过程包含两个步骤

    A:800 - 200 = 600
    B:200 + 200 = 400

    原子性表示,这两个步骤一起成功,或者一起失败,不能只发生其中一个动作

    一致性(Consistency)

    针对一个事务操作前与操作后的状态一致

    操作前A:800,B:200
    操作后A:600,B:400

    一致性表示事务完成后,符合逻辑运算

    持久性(Durability)

    表示事务结束后的数据不随着外界原因导致数据丢失

    操作前A:800,B:200
    操作后A:600,B:400

    如果在操作前(事务还没有提交)服务器宕机或者断电,那么重启数据库以后,数据状态应该为
    A:800,B:200

    如果在操作后(事务已经提交)服务器宕机或者断电,那么重启数据库以后,数据状态应该为
    A:600,B:400

    隔离性(Isolation)

    针对多个用户同时操作,主要是排除其他事务对本次事务的影响

    两个事务同时进行,其中一个事务读取到另外一个事务还没有提交的数据,B

    二、事务隔离级别

    脏读

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

    不可复读

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

    页面统计查询值

    点击生成报表的时候,B有人转账进来300(事务已经提交)

    虚读(幻读)

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

    三、四种隔离级别设置

    数据库

    设置事务隔离级别

    mysql> set transaction isolation level
    

    查询当前事务隔离级别

    mysql> select @@tx_isolation
    
    设置 描述
    Serializable 可避免脏读、不可重复读、虚读情况的发生。(串行化)
    Repeatable read 可避免脏读、不可重复读情况的发生。(可重复读)
    Read committed 可避免脏读情况发生(读已提交)。
    Read uncommitted 最低级别,以上情况均无法保证。(读未提交)

    java

    适当的 Connection 方法,比如 setAutoCommit 或 setTransactionIsolation

    设置 描述
    TRANSACTION_SERIALIZABLE 指示不可以发生脏读、不可重复读和虚读的常量。
    TRANSACTION_REPEATABLE_READ 指示不可以发生脏读和不可重复读的常量;虚读可以发生。
    TRANSACTION_READ_UNCOMMITTED 指示可以发生脏读 (dirty read)、不可重复读和虚读 (phantom read) 的常量。
    TRANSACTION_READ_COMMITTED 指示不可以发生脏读的常量;不可重复读和虚读可以发生。

    四、mysql模拟事务隔离性测试

    SELECT @@session.tx_isolation;   
    SELECT @@tx_isolation;  
      
    SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted;  
    SET SESSION TRANSACTION ISOLATION LEVEL read committed;  
    SET SESSION TRANSACTION ISOLATION LEVEL repeatable read;  
    SET SESSION TRANSACTION ISOLATION LEVEL serializable;  
    
    start transaction;
    
    --建表
    drop table AMOUNT;
    CREATE TABLE `AMOUNT` (
    `id`  varchar(10) NULL,
    `money`  numeric NULL
    )
    ;
    --插入数据
    insert into amount(id,money) values('A', 800);
    insert into amount(id,money) values('B', 200);
    insert into amount(id,money) values('C', 1000);
    --测试可重复读,插入数据
    insert into amount(id,money) values('D', 1000);
    
    --设置事务
    SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted;  
    SELECT @@tx_isolation;  
    --开启事务
    start transaction;
    
    --脏读演示,读到其他事务未提交的数据
    --案列1,事务一:A向B转200,事务二:查看B金额变化,事务一回滚事务
    update amount set money = money - 200 where id = 'A';
    update amount set money = money + 200 where id = 'B';
    
    --不可重复读演示,读到了其他事务提交的数据
    --案列2,事务一:B向A转200,事务二:B向C转200转100
    SET SESSION TRANSACTION ISOLATION LEVEL read committed;  
    
    --开启事务
    start transaction;
    --两个事务都查一下数据(转账之前需要,查一下金额是否够满足转账)
    select * from amount;
    --事务一:B向A转200
    update amount set money = money - 200 where id = 'B';
    update amount set money = money + 200 where id = 'A';
    
    commit;
    --事务二:B向C转200转100
    update amount set money = money - 100 where id = 'B';
    update amount set money = money + 100 where id = 'C';
    commit;
    --从事务二的角度来看,读到了事务一提交事务的数据,导致金额出现负数
    
    --幻读演示
    --案列3,事务一:B向A转200,事务二:B向C转200转100
    SET SESSION TRANSACTION ISOLATION LEVEL repeatable read;  
    
    --开启事务
    start transaction;
    --两个事务都查一下数据(转账之前需要,查一下金额是否够满足转账)
    select * from amount;
    --事务一:B向A转200
    update amount set money = money - 200 where id = 'B';
    update amount set money = money + 200 where id = 'A';
    
    commit;
    --事务二:B向C转200转100
    update amount set money = money - 100 where id = 'B';
    update amount set money = money + 100 where id = 'C';
    commit;
    --从事务二的角度来看,读到了事务一提交事务的数据,导致金额出现负数
    
    

    serializable事务二会一直等着事务一提交再操作


    https://blog.csdn.net/dengjili/article/details/82468576
    https://www.jianshu.com/p/20e10ed721d0

    WilliamZheng©版权所有 转载请注明出处! 运维架构师群:833329925
  • 相关阅读:
    商贸通帐套隐藏方法
    固定资产打开提示:上年度数据未结转!
    ZOJ 2432 Greatest Common Increasing Subsequence
    POJ 1080 Human Gene Functions
    POJ 1088 滑雪
    POJ 1141 Brackets Sequence
    POJ 1050 To the Max
    HDOJ 1029 Ignatius and the Princess IV
    POJ 2247 Humble Numbers
    HDOJ 1181 变形课
  • 原文地址:https://www.cnblogs.com/williamzheng/p/11346803.html
Copyright © 2011-2022 走看看