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


    事务管理

    数据库事务的原理

    #创建银行帐号表
    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
  • 相关阅读:
    什么是IPv6?与IPv4相比,IPv6具备哪些技术优点?
    卷积神经网络(Convolutional Neural Networks,CNN)
    C语言例3-26:逗号表达式的例子
    ARM开发初级-STM32时钟系统以及如何正确使用HAL_Delay-学习笔记08
    Android ijkplayer播放rtsp直播流
    数据湖建设解决方案 2022
    1.30.Flink SQL案例将Kafka数据写入hive
    HTML复习笔记
    使用Markdown语法写矩阵
    WebKit Insie: Active 样式表
  • 原文地址:https://blog.csdn.net/Liu_wen_wen/article/details/125893083