目录
引言:
什么是事务?
事务和锁
mysql数据库控制台事务的几个重要操作指令(transaction.sql)
1、事物操作示意图:
2.事务的隔离级别
四种隔离级别:
总结一下隔离指令
1. 查看当前隔离级别
2.设置隔离级别
(1) 设置当前会话(临时生效)
(2) 设置全局(需管理员权限)
3.修改默认级别
3.ACID 特性
1.原子性 (Atomicity)
2. 一致性 (Consistency)
3. 隔离性 (Isolation)
4. 持久性 (Durability)
类别 | SQL 语句示例 | 作用 |
---|---|---|
DML | INSERT , UPDATE , DELETE | 操作数据(增删改查) |
DDL | CREATE , ALTER , DROP | 定义数据库结构(如表、索引、视图等) |
DCL | GRANT , REVOKE | 控制访问权限 |
TCL | COMMIT , ROLLBACK | 管理事务 |
引言:
-
什么是事务?
事务就是用于保证数据的一致性,她由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。如:转账就必须保证事务的一致性。
比如我这里有两个指令:
-- 转账人
update balance set balance=balance-100 where id = 1
--收款人
update balance set balance=balance+100 where id = 2
如何保证两条语句同时执行成功?
-
事务和锁
当执行操作(dml语句) ,mysql会在表上加锁,防止其他用户修改表的数据,这对用户来说是非常重要的
-
mysql数据库控制台事务的几个重要操作指令(transaction.sql)
1.start transaction --开启一个事务
2.savepoint 自定义保存点的名称 --设置保存点
3.rollback ro 自定义保存点名称 --回退事务
4.rollback --回退全部事务,回到事务开始的时候
5.commit --提交事务,结束事务,删除该事务的所有保存点,删除锁,不能回退,数据生效,其他会话[其他连接]可以查看生效的新数据
1、事物操作示意图:
类似于git的回滚操作
用户a在进行事务操作的时候,用户b在数据库是查看不到一部分数据的变化的,必须要等到用户a提交才行,这叫事务隔离,至于是看得见哪一部分的数据得取决于用的隔离级别
还有一种开启事务的方式:set autocommit = off
-- 关闭当前会话的自动提交(影响后续所有操作)
SET autocommit = 0;
INSERT INTO orders (product_id) VALUES (101);
-- 必须显式提交
COMMIT;
-- 恢复自动提交(否则后续操作仍需要手动提交)
SET autocommit = 1;
2.事务的隔离级别
1.多个连接开启各自事务操作数据库中的数据时,数据库系统要负责隔离操作,以保证连接在获取数据的准确性
2.如果不考虑隔离性,会导致:脏读、不可重复读、幻读
脏读:当应一个事务读取另外一个事务尚未提交的修改时,产生脏读。就是也可能别人回滚了或者放弃提交了,但是你读到了。
不可重复读:同一个查询在同一个事务中多次进行,由于其他用户提交的事务所做的修改或者删除,每次返回不同的结果集,此时发生不可重复读
幻读:同一个查询在同一个事务中多次进行,由于其他用户提交事务所作的插入操作,每次返回不同的结果集
四种隔离级别:
1.读未提交 read uncommitted
2.读已提交 read committed
3.可重复读 repeatable read
4.可串行化 serializable
测试一下功能:
打开两个操作台a和b
指令1:查询当前mysql的隔离级别
select @@tx_isolation;
或者
SELECT @@transaction_isolation;
会得到一个可重复读的隔离级别
指令2:修改一下这个用户a的隔离级别为读未提交
set session transaction isolation level read uncommitted;
设置成功
我们来对比一下:
此时用户a执行一个语句,还没有commot,但是用户b也能看见,这就是脏读
其他情况也是类似,可以自行下去动手查看
那这些脏读、不可重复读、幻读我们都理解了,那锁呢?
当用户a开启事务之后插入更新了一些数据
那么用户b持有可串行化的隔离级别,是什么情况:
答案是按回车之后被卡住,这个用户b会一直等待连接到这个数据库
这时候就有两种情况:
1.超时:
2.用户a提交了,用户b才出现结果
总结一下隔离指令
1. 查看当前隔离级别
-- 查看当前会话的隔离级别
SELECT @@SESSION.transaction_isolation;
-- 查看全局隔离级别
SELECT @@GLOBAL.transaction_isolation;
2.设置隔离级别
(1) 设置当前会话(临时生效)
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -- 读未提交
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 读已提交
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 可重复读(默认)
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; -- 串行化
(2) 设置全局(需管理员权限)
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 修改全局配置
FLUSH PRIVILEGES; -- 刷新权限(可选)
3.修改默认级别
3.ACID 特性
原子性 (Atomicity) → 确保操作完整性
一致性 (Consistency) → 确保数据有效性
隔离性 (Isolation) → 确保并发可控性
持久性 (Durability) → 确保结果永久性
1.原子性 (Atomicity)
- 定义:事务是最小的工作单元,不可再分割。
- 核心原则:事务中的操作要么全部成功,要么全部失败回滚。
- 示例:银行转账中,扣款和收款必须同时成功或同时失败。
2. 一致性 (Consistency)
- 定义:事务执行前后,数据库必须从一个一致性状态变换到另一个一致性状态。
- 核心原则:数据完整性约束(如主键、外键、唯一约束)不会被破坏。
- 示例:转账前后,双方账户总额应保持不变。
3. 隔离性 (Isolation)
- 定义:多个并发事务之间相互隔离,一个事务的操作不应影响其他事务。
- 核心原则:通过隔离级别(如
READ COMMITTED
)控制事务间的可见性。 - 问题规避:避免脏读、不可重复读、幻读等问题。
4. 持久性 (Durability)
- 定义:事务一旦提交,对数据的修改就是永久性的。
- 核心原则:即使系统崩溃,数据也能通过日志恢复。
- 实现机制:依赖事务日志(如 InnoDB 的 redo log)。