重点内容 :
本章中重点内容在第四点 [ 事物特性和隔离级别 ] 上 , 需要背诵记忆该部分内容
1. 什么是事务
- 什么是事务:数据库的概念,指 事务组成的一级操作单元,要么全部成功,要么全部失败。
- 事务的作用:保证多个操作要么全部成功,要么全部失败。
- 什么时候使用事务:多条DML语句执行时,要求都成功或都失败。事务无关查询操作
- 事务的经典使用场景:张三要给李四转账100
- 开启事务
- 执行SQL:张三扣钱100
- 执行SQL:李四加钱100
- 关闭事务:提交事务:SQL语句
- 生效回滚事务:SQL语句撤消
2. 事务管理数据准备-- 事务管理
2.1 准备数据
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
money DOUBLE
);
INSERT INTO account (id,NAME,money) VALUES (NULL, 'tom', 1000);
INSERT INTO account (id,NAME,money) VALUES (NULL, 'jerry', 1000);
2.2 手动提交的事务管理
-- 手动提交的事务管理
-- 1. 开启事务
START TRANSACTION;
-- 2. tom扣钱100 数据变更没有真正生效,是缓存起来了
UPDATE account SET money = money - 100 WHERE NAME = 'tom';
-- 3. jerry加钱100
UPDATE account SET money = money + 100 WHERE NAME = 'jerry';
-- 4. 关闭事务:提交事务
-- commit;
-- 4. 关闭事务:回滚事务
ROLLBACK;
2.3 自动提交的事务
- 管理自动提交的开关设置和查询
-- 自动提交事务 开关进行管理
-- 1. 操作自动提交的开关
-- 1.1 查看自动提交的开关状态
SELECT @@autocommit;
-- 1.2 关闭自动提交的开关
SET autocommit = 0;
-- 1.3 开启自动提交的开关
SET autocommit = 1;通过自动提交开关,进行事务管理-- 2. 通过 自动提交的开关,进行事务管理
-- 2.1 关闭自动提交
SET autocommit = 0;
-- 2.2 执行tom扣钱100
UPDATE account SET money = money - 100 WHERE NAME = 'tom';
-- 2.3 执行jerry加钱100
UPDATE account SET money = money + 100 WHERE NAME = 'jerry';
-- 2.4 关闭事务:提交事务
COMMIT;
-- 2.4 关闭事务:回滚事务
ROLLBACK;
-- 2.5 开启自动提交
SET autocommit = 1;
3. 回滚点(了解)
- 回滚点:事务里可以回滚到指定的回滚点,而不必回滚事务里所有的操作
-- 回滚点
-- 1. 开启事务
START TRANSACTION;
-- 2. tom扣钱100,余额:900
UPDATE account SET money = money - 100 WHERE NAME ='tom';
-- 3. tom扣钱100,余额:800
UPDATE account SET money = money - 100 WHERE NAME ='tom';
-- 4. 设置一个回滚点,名称:point1
SAVEPOINT point1;
-- 5. tom扣钱100,余额:700
UPDATE account SET money = money - 100 WHERE NAME ='tom';
-- 6. 回滚到point1
ROLLBACK TO point1;
-- 7. 关闭事务:提交事务 tom余额:800
COMMIT;
4. 事物特性和隔离级别(概念性)
4.1 事务的四大特性ACID(面试题)
- A:Atomicity,原子性。事务不可分割,即:事务里所有操作要成功,都成功;要失败,都失败。不可能成功一半
- C: Consistency,一致性。事务提交前后,数据是完整一致的
- I:Isolation,隔离性。多事务并发时,理论上事务应该是完全隔离,相互独立、互不影响的
- D:Durability,持久性。事务一旦提交,数据变更就永久保存到磁盘文件上了。
4.2 事务的隔离级别和并发问题
4.2.1 事务并发的问题
- 脏读:一个事务里,读取到了另外一个事务未提交的数据
- 不可重复读:一个事务里,多次读取的数据不一致;受到了其它事务的update干扰
- 虚读/幻读:一个事务里,多次读取的数据数量不一致;受到了其它事务的insert、delete干扰
4.2.2 事务的隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted | ★ | ★ | ★ |
read committed | ☆ | ★ | ★ |
repeatable read | ☆ | ☆ | ★ |
serializable | ☆ | ☆ | ☆ |