三 事务安全 TCL【理解】
3.1 概述
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
应用场景:用户转账
准备数据
-- 创建库create database day21_pro;-- 使用库use day21_pro;-- 创建数据表CREATE TABLE account ( -- 账户表id INT PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR(32),money DOUBLE);-- 添加数据INSERT INTO account (`name`, money) VALUES ('蝴蝶姐', 1000), ('罗志祥', 1000);
模拟转账
-- 罗志祥扣钱(转出)UPDATE account SET money = money -100 WHERE id = 2;-- 机器故障了-- 蝴蝶姐加强(转入)UPDATE account SET money = money + 100 WHERE id = 1;
3.2 操作事务【掌握】
3.2.1 手动提交事务【手动操作mysql使用方案】
1. 开启事务begin2. 提交事务commit3. 回滚事务rollback
转账成功
-- 1. 开启事务begin;-- 2. 罗志祥扣钱UPDATE account SET money = money -100 WHERE id = 2;-- 3. 蝴蝶姐加钱UPDATE account SET money = money + 100 WHERE id = 1;-- 4. 提交事务commit;
转账失败
-- 1.开启事务begin;-- 2.罗志祥扣钱UPDATE account SET money = money -100 WHERE id = 2;-- 3.机器故障-- 4.回滚事务rollback;
3.2.2 自动提交事务【在JDBC将自动提交关闭】
* 默认情况下,在MySQL中每一条DML(增删改)语句,就是一个独立的事务* 查看MySQL是否开启自动提交show variables like 'autocommit';* 临时关闭自动提交(手动)set autocommit=off;
模拟转账
-- 1.罗志祥扣钱UPDATE account SET money = money -100 WHERE id = 2;-- 2.改为手动提交/回滚commit / rollback ;
3.3 事务工作原理
注意:
在同一个事务中,出现bug(异常),必须执行rollback命令,不然会影响同一个事务中下一次提交

3.4 保存(回滚)点【了解】
当事务开启后,一部分sql执行成功,添加一个保存点,后续操作报错了,回滚到保存点,保证之前的操作可以成功提交
1. 设置保存点savepoint 保存点名;2. 回滚到保存点rollback to 保存点名;
场景:罗志祥同时约5个小姐姐,如果前二个成功扣款了设置保存点,保证前二位能够上门服务….
-- 1.开启事务begin;-- 2.罗志祥扣钱一次(凤姐)UPDATE account SET money = money -100 WHERE id = 2;-- 3.罗志祥扣钱二次(芙蓉姐姐)UPDATE account SET money = money -100 WHERE id = 2;-- 4.设置一个保存点savepoint ol;-- 5.罗志祥扣钱三次(石榴姐)UPDATE account SET money = money -100 WHERE id = 2;-- 6.机器故障-- 7.回滚点保存点rollback to ol;-- 8.提交事务commit;
3.5 事务特性 ACID【面试题】
1. 原子性:A atomicity如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。2. 一致性:C consistency事务在执行前后,保证数据的一致性3. 隔离性:I isolation【重点】多个事务之间,相互独立,互不干扰....4. 持久性:D durability事务一旦成功提交,保存到磁盘文件,不可逆....
3.6 事务隔离性
多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
1. 脏读【必须要避免的....】一个事务中,读取到另一个事务,未提交的数据2. 不可重复读一个事务中,二次读取的内容不一致,另外一个事务做了update操作3. 幻读一个事务中,二次读取的数量不一致,另外一个事务做了insert、delete操作
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
