zoukankan      html  css  js  c++  java
  • 事物的隔离级别

    Begin:

    mysql 事物默认是自动提交的

    • select @@autocommit 查询 (1表示自动提交 ,0表示不自动提交)
    • set   @@autocommit =0
    • select @@transaction_isolation  查询事物的默认属性

    事物:

    事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。

    例如:A——B转帐,对应于如下两条sql语句

      update account set money=money-100 where name=‘a’;
    
      update account set money=money+100 where name=‘b’;

    事物特性acid

    • 原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
    •  一致性(Consistency)事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
    • 隔离性(Isolation)事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
    • 持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

    涉及命令

    • commit()
    • rollback()
    • start transaction 或者 Begin
    • savePoint()事物状态点
    • Savepoint sp = conn.setSavepoint();
    • Conn.rollback(sp);

    隔离级别:

    脏读

    • 一个事物读取了另一个事物未提交的数据

    不可重复读

    • 同一个记录读取结果前后不一致

    幻读

    • 同一张表前后不一致的记录数

    一个单表数据

    DROP TABLE IF EXISTS `heros_temp`;
    CREATE TABLE `heros_temp`  (
      `id` int(11) NOT NULL,
      `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of heros_temp
    -- ----------------------------
    INSERT INTO `heros_temp` VALUES (1, '张飞');
    INSERT INTO `heros_temp` VALUES (2, '关羽');
    INSERT INTO `heros_temp` VALUES (3, '刘备');

    基础:

    注意: 这里不能开始就在cmd下启动两个客户端, 将无法出现演示结果(原因: 设置session连接是对于单个client的,所以最好是设置全局事物原则)

    mysql> SHOW VARIABLES LIKE 'transaction_isolation'; // 查询当前隔离级别
    mysql> SET global TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; // 设置隔离级别为读未提交
    mysql> SET autocommit = 0; // 设置事务不自动提交(由于MySQL的事务是自动提交的, 这里需要改一下)
    
    mysql> slelect @@autocommit // 查询默认的提交事物的方式
    
    mysql> slelect @@transaction_isolation // 查询默认的隔离级别
    登录:
    mysql -u root -p

    脏读

      确认下面两个配置

      

       客户端一 开始事物 并且插入一条数据

      我们来客户端查看的表中的数据

     显然出现 了问题

    不可重复读

      客户端2 查询全表数据

      

      客户端1 开启事物  修改id=3原name'为刘备的数据

     再次来客户端2查看一下的数据

       出现问题

    幻读

    客户端2查询数据

     客户端1增加一条数据

     再次来客户端2查看一下数据,必须满足第一次查询的条件

     出现问题,

    最后;别忘记了 将将全局隔离级别 恢复为可重复读

  • 相关阅读:
    微信小程序退款【证书的使用】
    生成随机位数的UUID
    弹出层-layui
    load加载层-layui
    form-layui
    table-layui
    下拉列表模仿placeholder效果
    .net core 2.0 Unable to convert MySQL date/time to System.DateTime
    .net core Include问题
    .net core 2.0 配置Session
  • 原文地址:https://www.cnblogs.com/dgwblog/p/11784421.html
Copyright © 2011-2022 走看看