缠丝猫 发表于 2025-3-29 01:48:20

【MySQL】MySQL事件(Transaction)(具体)

什么是事件

   事件是一组操纵的集合,它是一个不可分割的工作单元,事件会把所有的操纵作为一个整体一起向系统提交或撤销操纵请求,即这些操纵要么同时成功,要么同时失败。
事件是必要手动开启的
怎么开启事件

操纵描述关键字查看查看或设置事件是否自动提交,0 表示禁用自动提交SELECT @@autocommit提交事件提交当前事件,确保所有更改持久化COMMIT;回滚事件回滚当前事件,撤销自前次提交以来的所有更改ROLLBACK;设置事件提交方式(全局)为0表示设置事件为手动提交Set @@autocommit = 0设置事件提交方式(局部)只有当前事件设置为手动提交START TRANSACTIONBEGIN; 事件四大特性(ACID)



[*]原子性(Atomicity):事件是不可分割的最小操纵单元,要么全部成功,要么全部失败。
[*]一致性(Consistency):事件完成时,必须使所有的数据都保持一致状态。       就拿A给B转账来表明,假如说转账前后A、B账户总金额都是10000元,就是数据库的一致性规则,假如A给B转账5000元,而此时数据库待机,B的账户没有得到5000元这就违反了一致性。一致性是通过特久性+原子性+隔离性来保证的
[*]隔离性(Isolation):数据库系统提供的隔离机制,保证事件在不受外部并发操纵影响的独立环境下运行。
[*]持久性(Durability):事件一旦提交或回滚,它对数据库中的数据的改变就是永久的。
并发事件问题

多个事件实验时遇到的并发事件问题
类型描述脏读一个事件读取到另一个事件尚未提交的数据,假如另一个事件回滚,读取的数据变为无效(脏数据)。不可重复读一个事件在实验过程中,先后读取同一条记载,但两次读取的结果差别,可能是另一个事件修改了该记载。幻读一个事件根据条件查询数据时,某些数据行不存在,但在事件实验过程中,另一个事件插入大概删除了符合条件的数据,导致查询结果出现“幻影”。 赃读

读到别的事件未提交的数据
https://i-blog.csdnimg.cn/direct/04781ffdf8d44b1d8220546d60907786.png
time1: 事件A对数据库id举行更改
time2: 事件B在A未提交事件前 读取到id=1的数据
time3: 事件回滚导致事件A的修改回滚
此时time3时事件B拿到的数据是临时的、不精确的。
不可重复读

同一事件 的两次查询结果不一致https://i-blog.csdnimg.cn/direct/714dfd854ffd45dbaa3fe3e8e194441a.png
time1: 事件A先读取到id=1的数据
time2: 事件B举行对id更改后
time3: 事件B提交事件
time4: 事件A再次读取到id=1的数据
事件A两次读取的结果中的数据差别
幻读

MySql文档中的描述如下
   The so-called phantom problem occurs within a transaction when the same query produces different sets of rows at different times. For example, if a SELECT is executed twice, but returns a row the second time that was not returned the first time, the row is a “phantom” row.
翻译:当同一个查询在差别的时间产生差别的结果集时,事件中就会出现所谓的幻象问题。比方,假如 SELECT 实验了两次,但第二次返回了第一次没有返回的行,则该行是“幻像”行。
幻读 说的是数据存不存在,而不可重复读紧张说的是数据是否改变。
https://i-blog.csdnimg.cn/direct/ed6ce11685334682945a5609da2d2a2d.png
time1: 事件A先读取到的数据
time2: 事件B举行对id更改后
time3: 事件B 提交事件
time4: 事件A再次读取的数据
事件A两次读取的 结果的数据集 差别
事件隔离级别

从上到下 性能从高到低 数据安全性从低到高
隔离级别描述可能发生的并发事件问题读未提交 (Read Uncommitted)答应事件读取到其他事件未提交的数据(脏数据)。脏读、不可重复读、幻读读已提交 (Read Committed)事件只能读取到已提交的数据。不可重复读、幻读可重复读 (Repeatable Read)(默认级别)事件在整个过程中读取的数据始终相同。(快照读+MVCC 办理幻读 当前读+临键锁 办理幻读)幻读串行化 (Serializable)强制事件按顺序实验,完全制止并发问题。无 #查看事务隔离级别
SELECT @@transaction_isolation;
#1. 设置会话级别(仅对当前客户端窗口有效)
SET SESSION TRANSACTION ISOLATION LEVEL <隔离级别>;
# 2. 设置全局级别(对所有客户端窗口生效)
SET GLOBAL TRANSACTION ISOLATION LEVEL <隔离级别>;
准备工作

创建user表
CREATE TABLE `user` (
`id` int NOT NULL,
`name` varchar(10) COLLATE utf8mb3_bin DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin;
插入数据
INSERT INTO `user` (`id`, `name`)
VALUES
(1, '小红'),
(2, '小绿'),
(4, '小蓝'),
(10, '小黄');
开启两个命令行界面 左边为命令行1 右边为命令行2
https://i-blog.csdnimg.cn/direct/d53a0a66107f4cacb498604863cf753c.png
读未提交 (Read Uncommitted)

由于读未提交隔离界别下不能办理任何并发事件问题,所以这里只展示脏读的场景。
脏读:
https://i-blog.csdnimg.cn/direct/a354f09690f64524b247930ae7b1eed2.png
读已提交 (Read Committed)

办理脏读:此时命令行1隔离级别为读已提交 (Read Committed) 。
https://i-blog.csdnimg.cn/direct/b0695c1807184e539251d99f3f24c213.png
不可重复读:
https://i-blog.csdnimg.cn/direct/36ffa3f388744bf3bdb9091c61a33f19.png
可重复读 (Repeatable Read)mysql默认级别

办理不可重复度:此时命令行1隔离级别为可重复读 (Repeatable Read) 。
https://i-blog.csdnimg.cn/direct/8197843f49154c13b2e2bc43c7c434b7.png
幻读:可重复读 (Repeatable Read) ,通过了 MVCC(多版本并发控制) 和 锁 办理了大部分的幻读。(之后的文章会具体介绍什么是MVCC 和 锁)
https://i-blog.csdnimg.cn/direct/a58121e690bf4cb89138d6443dc860ce.png
串行化 (Serializable)

办理幻读:此时命令行1隔离级别为串行化 (Serializable) 。
https://i-blog.csdnimg.cn/direct/3ae6cb414fb147af81232a53eb93b870.png
总结

我们介绍了事件的基本概率、事件的并发事件问题、事件隔离级别。(假如文章有误,欢迎搭建品评指正)
假如我的内容对你有帮助,恳请点赞,批评,收藏。创作不易,大家的支持就是我坚持下去的动力!。博主正在积极创作中。https://i-blog.csdnimg.cn/direct/d17931325a25450aa908ce5b13f8fdcb.jpeg

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【MySQL】MySQL事件(Transaction)(具体)