zoukankan      html  css  js  c++  java
  • MySQL—事务(ACID)

    参考CSDN:https://blog.csdn.net/dengjili/article/details/82468576

    1.事务四大特性

    原子性(Atomicity)
      要么都成功,要么都失败。

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

    持久性(Durability)

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

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

      每个操作每个事务都要互相隔离。

        隔离所导致的一些问题

          1.脏读:

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

          2.不可重复读:

              在一个事务内读取表中的某一行数据,多次读取结果不同。

            (这个不一定是错误,只是某些场合不对) 

          3.虚读(幻读)

            就是别人事务都已经提交了,但是你的事务里读到的还是提交前的值。
            (一般是行影响,多了一行)

    MySQL---它是默认开启事务提交的!

    2.事务的隔离级别  

      SQL 标准定义了四个隔离级别:

    • READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
    • READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
    • REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
    • SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
    3.模拟转账案例

     -- 创建表

    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) VALUES('A',2000.00),('B',1000.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; -- 恢复默认自动提交
  • 相关阅读:
    编程习题05
    java初始化顺序
    项目开发问题
    hibernate相关知识
    工作使用到的SQL语句
    对于时间的灵活操作
    StringBuffer 和 StringBuilder的区别
    在WebService中处理IP地址
    使用web创建监听器
    工作笔记系列-学习的零零碎碎的技术
  • 原文地址:https://www.cnblogs.com/luckyjcx/p/12296354.html
Copyright © 2011-2022 走看看