本文介绍: 说明 任何一个人 不一定 要看到 最新的世界,也不一定 要 看到比较老的世界,只要看到在自己生命周期之内的事情即可事务1 将表的数据删除提交事务2 都是看不到的表的变化 ,直到事务2也提交,才可以看到表的变化。所有事务都要有执行过程 ,那么在 多个事务 各自执行多个SQL的时候,就有有可能出现相互影响的情况。当一个事务运行 ,另一个 事务 也在运行,这两个事务 在执行过程之中 就可以看作是 并发运行比如:你妈妈跟你说 ,那么就别学,要学就学到最好,至于你的学习过程,你妈妈是不关心。

事务异常与产出结论

没有启动事务之前,account表中存在孙权和刘备的数据


启动事务后, 向 account表中 插入 曹操数据
输入 CTRL 终端1中的客户端 崩溃
此时在终端2中 查看 表中数据发现启动事务后插入的曹操数据没有

说明客户端崩溃,MySQL会自动回滚


手动提交 和自动提交 对 回滚区别

输入 set autocommit=0 将提交方式改变
输入 show variables likeautocommit 查询当前提交方式
OFF 表示 将 自动提交关闭


启动事务之前,account表中 有两个数
启动事务之后,删除表中曹操的数据
客户端崩溃后,再次查询 发现 数据会 进行了回滚,将曹操的数据恢复回来了


输入 show variables likeautocommit查询提交方式
ON 表示 将 自动提交打开


在启动事务之前,account表中 存在 孙权 刘备 赵六 三个数
在启动事务之后,删除 对应的赵六的数据
若此时客户端崩溃,则 刘备数据直接丢失


所以 autocommit 的 提交方式 是会 影响 单个sql的(由于单个sql 也可看作事务,所以就会可以看作影响事务)

事务隔离性理论

如何理解隔离性?

所有事务都要有执行过程 ,那么在 多个事务 各自执行多个SQL的时候,就有有可能出现相互影响的情况
比如:你妈妈跟你说 ,那么就别学,要学就学到最好,至于你的学习过程,你妈妈是不关心
你的学习,对于你妈来说就是原子
因为在学习过程中,是很容易受到干扰的,所以就需要将你的学习环境隔离,保证你的学习环境是良好的


中国是有很多 为中国崛起 奋斗的先烈们,但是这些先烈 是看不到 现在 世界的样子的
在 很久之前 就已经 因为 某种 原因 过世了
说明 任何一个人 不一定 要看到 最新的世界,也不一定 要 看到比较老的世界,只要看到在自己生命周期之内的事情即可
(如:我们无法去未来 世界 感觉, 也无法 回到 清朝 去感觉,只需关心当下世界发生的变化即可)


出生的时间点不同,死亡的时间点不同,每个人看到的样貌就不一样

同理 让每一个事务 让其在到来时,看到它所应该看到的数据, 这个过程 称为 隔离


比如假设查找比较久,而转账很快, 你的朋友先转账,然后你才去查找
先转帐,说明转账来到比较早,原子级别上转账 执行就应该在查找前面
转账 和 查找 两者 事务 同时 进行 ,此时即便 转账做完了 ,你(查找)也不应该看到


MySQL的隔离级别

在此主要是简单介绍下,后面会详细说


读未提交
当一个事务 在运行 ,另一个 事务 也在运行,这两个事务 在执行过程之中 就可以看作是 并发运行

输入 select @@tx_isolation 查询隔离级别
发现是 隔离级别 读未提交


刚开始account表中有两个数据,当终端1启动事务后 进行删除数据
终端1并没有提交数据,而终端2就可以在表中查到 数据没有
当终端1客户端崩溃了,终端2就能把删除的数据进行回滚
说明一个事务对数据进行修改,另一个事务立马能看到


读提交

刚开始account表中有三个数据,当终端1启动事务后 进行将id值为3的数据name修改为 zhangsan
终端1并没有提交数据时,终端2查询表中数据没有变化
当终端1客户端进行提交了,在终端2中 再次查询就可以看到 修改后的数据

只能当 一个事务 进行 commit 之后, 另一个事务 才能看到修改后的数据


重复

是MySQL默认的隔离级别
事务1 将表的数据删除 或 提交,事务2 都是看不到的表的变化 ,直到事务2也提交,才可以看到表的变化

如:有两个小孩 进行潜水,要想知道对方是否上岸,就需要浮到水面上


串行
事务最高的隔离级别

必须按照到来的事件顺序,一个一个的执行,执行完了一个才进行下一个
就可以保证数据的绝对安全

事务隔离级别查看

查看隔离级别共有三种方法


第一种方法select @@global.tx_isolation;
查看全局隔离级别
(进行更改,会影响后续所有客户端的登录)


第二种方法:select @@session.tx_isolation;
查看 会话 全局隔离级别
(进行更改,只会影响会话)


第三种方法: select @@tx_isolation;

第三种方法是第二种方法的简写,两者的作用相同


设置隔离级别

SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ
COMMITTED | REPEATABLE READ | SERIALIZABLE}

sessionglobal 两者选一个,不要省略
transaction 称为 事务
isolation 称为 隔离
level 称为 级别
read uncommitted 称为 读未提交
read committed 称为 读提交
repeatable read 称为 可重复
serializable 称为 串行


在终端1中,将会话的隔离级别 设置为 读 提交


输入 select @@global.tx_isolation; 查询全局的隔离级别
发现全局的隔离级别没有变化


输入 select @@session.tx_isolation; 查询会话的隔离级别
发现会话的隔离级别 变为 读提交


在终端2中 查询全局隔离级别和 会话隔离级别
发现全局隔离级别和会话隔离级别 都是 读未提交 都没有受影响
说明会话隔离级别 只能影响 当前会话
(在终端1中修改会话,则会话受到影响,而终端2中的会话不受影响)


原文地址:https://blog.csdn.net/qq_62939852/article/details/134383422

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_13027.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注