zoukankan      html  css  js  c++  java
  • mysql事务测试

    mysql事务测试

    打开mysql的命令行,将自动提交事务给关闭

    --查看是否是自动提交 1表示开启,0表示关闭
    select @@autocommit;
    --设置关闭
    set autocommit = 0;
    

    数据准备

    --创建数据库
    create database tran;
    --切换数据库 两个窗口都执行
    use tran;
    --准备数据
     create table psn(id int primary key,name varchar(10)) engine=innodb;
    --插入数据
    insert into psn values(1,'zhangsan');
    insert into psn values(2,'lisi');
    insert into psn values(3,'wangwu');
    commit;
    

    测试事务

    --事务包含四个隔离级别:从上往下,隔离级别越来越高,意味着数据越来越安全
    read uncommitted; 	--读未提交
    read commited;		--读已提交
    repeatable read;	--可重复读
    (seariable)			--序列化执行,串行执行
    --产生数据不一致的情况:
    脏读
    不可重复读
    幻读
    
    隔离级别 异常情况 异常情况
    读未提交 脏读 不可重复读 幻读
    读已提交 不可重复读 幻读
    可重复读 幻读
    序列化

    测试1:脏读 read uncommitted

    set session transaction isolation level read uncommitted;
    A:start transaction;
    A:select * from psn;
    B:start transaction;
    B:select * from psn;
    A:update psn set name='msb';
    A:selecet * from psn
    B:select * from psn;  --读取的结果msb。产生脏读,因为A事务并没有commit,读取到了不存在的数据
    A:commit;
    B:select * from psn; --读取的数据是msb,因为A事务已经commit,数据永久的被修改
    

    测试2:当使用read committed的时候,就不会出现脏读的情况了,当时会出现不可重复读的问题

    set session transaction isolation level read committed;
    A:start transaction;
    A:select * from psn;
    B:start transaction;
    B:select * from psn;
    --执行到此处的时候发现,两个窗口读取的数据是一致的
    A:update psn set name ='zhangsan' where id = 1;
    A:select * from psn;
    B:select * from psn;
    --执行到此处发现两个窗口读取的数据不一致,B窗口中读取不到更新的数据
    A:commit;
    A:select * from psn;--读取到更新的数据
    B:select * from psn;--也读取到更新的数据
    --发现同一个事务中多次读取数据出现不一致的情况
    

    测试3:当使用repeatable read的时候(按照上面的步骤操作),就不会出现不可重复读的问题,但是会出现幻读的问题

    set session transaction isolation level repeatable read;
    A:start transaction;
    A:select * from psn;
    B:start transaction;
    B:select * from psn;
    --此时两个窗口读取的数据是一致的
    A:insert into psn values(4,'sisi');
    A:commit;
    A:select * from psn;--读取到添加的数据
    B:select * from psn;--读取不到添加的数据
    B:insert into psn values(4,'sisi');--报错,无法插入数据
    --此时发现读取不到数据,但是在插入的时候不允许插入,出现了幻读,设置更高级别的隔离级别即可解决
    

    总结

    ​ 现在学习的是数据库级别的事务,需要掌握的就是事务的隔离级别和产生的数据不一致的情况

    后续会学习声明式事务及事务的传播特性以及分布式事务

  • 相关阅读:
    css优先级
    常用CSS缩写语法总结
    老婆,同床不仅是老公生理的需要,更是心理的需要
    地震预测与概率(转)
    转载:如何研究系统的体系结构
    在RIA应用中,定义DTO作为工作划分的依据或接口
    需求分析应包含理解需求描述本身意思还包括给出解决方案
    今天规定了完成作业的时间,小东西到是按时完成了,基本上是吓写的,看来要严格要求了
    生活不能实验,结果只有一个,不要相信概率
    让人头疼的概率论游戏
  • 原文地址:https://www.cnblogs.com/Courage129/p/14059049.html
Copyright © 2011-2022 走看看