三 事务安全 TCL【理解】

3.1 概述

如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。

应用场景:用户转账

准备数据

  1. -- 创建库
  2. create database day21_pro;
  3. -- 使用库
  4. use day21_pro;
  5. -- 创建数据表
  6. CREATE TABLE account ( -- 账户表
  7. id INT PRIMARY KEY AUTO_INCREMENT,
  8. `name` VARCHAR(32),
  9. money DOUBLE
  10. );
  11. -- 添加数据
  12. INSERT INTO account (`name`, money) VALUES ('蝴蝶姐', 1000), ('罗志祥', 1000);

模拟转账

  1. -- 罗志祥扣钱(转出)
  2. UPDATE account SET money = money -100 WHERE id = 2;
  3. -- 机器故障了
  4. -- 蝴蝶姐加强(转入)
  5. UPDATE account SET money = money + 100 WHERE id = 1;

3.2 操作事务【掌握】

3.2.1 手动提交事务【手动操作mysql使用方案】

  1. 1. 开启事务
  2. begin
  3. 2. 提交事务
  4. commit
  5. 3. 回滚事务
  6. rollback

转账成功1588563849352.png

  1. -- 1. 开启事务
  2. begin;
  3. -- 2. 罗志祥扣钱
  4. UPDATE account SET money = money -100 WHERE id = 2;
  5. -- 3. 蝴蝶姐加钱
  6. UPDATE account SET money = money + 100 WHERE id = 1;
  7. -- 4. 提交事务
  8. commit;

转账失败

  1. -- 1.开启事务
  2. begin;
  3. -- 2.罗志祥扣钱
  4. UPDATE account SET money = money -100 WHERE id = 2;
  5. -- 3.机器故障
  6. -- 4.回滚事务
  7. rollback;

3.2.2 自动提交事务【在JDBC将自动提交关闭】

  1. * 默认情况下,在MySQL中每一条DML(增删改)语句,就是一个独立的事务
  2. * 查看MySQL是否开启自动提交
  3. show variables like 'autocommit';
  4. * 临时关闭自动提交(手动)
  5. set autocommit=off;

模拟转账

  1. -- 1.罗志祥扣钱
  2. UPDATE account SET money = money -100 WHERE id = 2;
  3. -- 2.改为手动提交/回滚
  4. commit / rollback ;

3.3 事务工作原理

注意:

在同一个事务中,出现bug(异常),必须执行rollback命令,不然会影响同一个事务中下一次提交

1588565465224.png

3.4 保存(回滚)点【了解】

  1. 当事务开启后,一部分sql执行成功,添加一个保存点,后续操作报错了,回滚到保存点,保证之前的操作可以成功提交
  1. 1. 设置保存点
  2. savepoint 保存点名;
  3. 2. 回滚到保存点
  4. rollback to 保存点名;

场景:罗志祥同时约5个小姐姐,如果前二个成功扣款了设置保存点,保证前二位能够上门服务….

  1. -- 1.开启事务
  2. begin;
  3. -- 2.罗志祥扣钱一次(凤姐)
  4. UPDATE account SET money = money -100 WHERE id = 2;
  5. -- 3.罗志祥扣钱二次(芙蓉姐姐)
  6. UPDATE account SET money = money -100 WHERE id = 2;
  7. -- 4.设置一个保存点
  8. savepoint ol;
  9. -- 5.罗志祥扣钱三次(石榴姐)
  10. UPDATE account SET money = money -100 WHERE id = 2;
  11. -- 6.机器故障
  12. -- 7.回滚点保存点
  13. rollback to ol;
  14. -- 8.提交事务
  15. commit;

3.5 事务特性 ACID【面试题】

  1. 1. 原子性:A atomicity
  2. 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
  3. 2. 一致性:C consistency
  4. 事务在执行前后,保证数据的一致性
  5. 3. 隔离性:I isolation【重点】
  6. 多个事务之间,相互独立,互不干扰....
  7. 4. 持久性:D durability
  8. 事务一旦成功提交,保存到磁盘文件,不可逆....

3.6 事务隔离性

  1. 多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
  1. 1. 脏读【必须要避免的....】
  2. 一个事务中,读取到另一个事务,未提交的数据
  3. 2. 不可重复读
  4. 一个事务中,二次读取的内容不一致,另外一个事务做了update操作
  5. 3. 幻读
  6. 一个事务中,二次读取的数量不一致,另外一个事务做了insertdelete操作

3.6.1 MySQL数据库隔离级别

级别 名字 隔离级别 脏读 不可重复读 幻读 数据库默认隔离级别
1 读未提交 read uncommitted
2 读已提交 read committed Oracle和SQL Server
3 可重复读 repeatable read MySQL
4 串行化 serializable

性能角度:1>2>3>4

安全角度:4>3>2>1

综合考虑:2 or 3