• 第五章 数据库设计和事务 ② 代码


    事务管理

    数据库事务的原理

    #创建银行帐号表
    create table bank
    (
    		bid int primary key auto_increment,
    		account varchar(20),
    		money int
    );
    
    select * from bank;
    
    insert into bank
    (account,money)
    values
    ('张三',10000),
    ('李四',10000);
    
    select * from bank;
    
    #手动开启事务
    start transaction;
    
    update bank
    	set money=money-1000
    where account='张三';
    
    select * from bank;
    
    #突然出错
    #回滚事务
    #rollback;  #只能执行一次,回滚之后手动事务就结束了。
    
    select * from bank;
    
    update bank
    	set money=money+1000
    where account='李四';
    
    #手动提交事务
    commit;
    
    select * from bank;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    代码仅供参考

    MySQL事务隔离级别

    1.Read Uncommitted(未提交读) ru

    
    #事务a
    #设置事务为未提交读
    set session transaction isolation level read uncommitted;
    #开始手动事务
    start transaction;
    #更新数据
    update classInfo
    set className='111'
    where classId=1;
    #回滚事务
    rollback;
    
    select * from classInfo
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    
    #事务b:在另外一个脚本中运行
    set session transaction isolation level read uncommitted;
    select * from classInfo where classId=1
    
    • 1
    • 2
    • 3
    • 4

    2.Read Committed(提交读)rc

    
    #事务a
    #设置事务隔离级别为提交读
    set session transaction isolation level read committed;
    #开启手动事务
    start transaction;
    #在事务中第一次查询数据
    select * from classInfo where classId = 1;
    #在事务中第二次查询数据
    select * from classInfo where classId =1;
    #提交事务
    commit;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    
    #事务b(在另外一个脚本中执行)
    set session transaction isolation level read committed;
    start transaction;
    update classInfo
    set className='111'
    where classId = 1
    commit;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3.Repeatable Read(可重复读)rr

    
    #事务a
    #设置事务隔离级别为可重复读
    set session transaction isolation level repeatable read;
    #开启手动事务
    start transaction;
    #查询编号为10的班级
    select * from classInfo where classId=10;
    #插入班级编号为10的班级
    insert into classInfo
    (classid,className)
    values
    (10,'AAA10');
    #提交事务
    commit;
    
    select * from classInfo
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    #事务b(在另外一个脚本中上运行)
    set transaction isolation level repeatable read;
    
    
    #开启手动事务
    start transaction;
    #插入编号为10的班级
    insert into classInfo
    (classId,className)
    values
    (10,'AAA10');
    #提交事务
    commit;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4.Serializable(可串行化)

    #事务a
    #设置事务隔离级别为可重复读
    set session transaction isolation level serializable;
    #开启手动事务
    start transaction;
    #查询编号为10的班级
    select * from classInfo where classId=10;
    #插入班级编号为10的班级
    insert into classInfo
    (classid,className)
    values
    (10,'AAA10');
    #提交事务
    commit;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    #事务b(在另外一个脚本中上运行)
    set transaction isolation level serializable;
    
    
    #开启手动事务
    start transaction;
    #插入编号为10的班级
    insert into classInfo
    (classId,className)
    values
    (10,'AAA10');
    #提交事务
    commit;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    问题

    1.脏读

    #解决脏读问题,提升数据库库隔离级别
    
    #事务a
    #设置事务为提交读
    set session transaction isolation level read committed;
    #开始手动事务
    start transaction;
    #更新数据
    update classInfo
    set className='111'
    where classId=1;
    #回滚事务
    rollback;
    
    select * from classInfo
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    #将事务隔离级别提升为提交读
    
    #事务b:在另外一个脚本中运行
    set session transaction isolation level read committed;
    select * from classInfo where classId=1
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.幻读

    #事务a
    #设置事务隔离级别为提交读
    set session transaction isolation level repeatable read;
    #开启手动事务
    start transaction;
    #在事务中第一次查询数据
    select * from classInfo where classId = 1;
    #在事务中第二次查询数据
    select * from classInfo where classId =1;
    #提交事务
    commit;
    
    select * from classInfo;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    #事务b(在另外一个脚本中执行)
    set session transaction isolation level repeatable read;
    start transaction;
    update classInfo
    set className='111'
    where classId = 1
    commit;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    老卫带你学---leetcode刷题(215. 数组中的第K个最大元素)
    04-HTTPS证书格式及转换
    Python魔术方法
    VivadoAndTcl: synth_ip
    【附源码】计算机毕业设计JAVA婚纱摄影管理
    Hadoop——Yarn 调度器和调度算法
    TeamTalk中msg_server初始化工作,如何维护与其他服务器的心跳连接
    Unity实现Camera和Audio数据的低延迟RTMP推送技术探讨
    python爬虫基础(一)
    Linux操作系统——线程概念
  • 原文地址:https://blog.csdn.net/Liu_wen_wen/article/details/125893083