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

打印 上一主题 下一主题

主题 1601|帖子 1601|积分 4803

什么是事件

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

操纵描述关键字查看查看或设置事件是否自动提交,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):事件一旦提交或回滚,它对数据库中的数据的改变就是永久的。
并发事件问题

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

读到别的事件未提交的数据

time1: 事件A对数据库id举行更改
time2: 事件B在A未提交事件前 读取到id=1的数据
time3: 事件回滚导致事件A的修改回滚
此时time3时事件B拿到的数据是临时的、不精确的。
不可重复读

同一事件 的两次查询结果不一致

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 实验了两次,但第二次返回了第一次没有返回的行,则该行是“幻像”行。
  幻读 说的是数据存不存在,而不可重复读紧张说的是数据是否改变。

time1: 事件A先读取到的数据
time2: 事件B举行对id更改后
time3: 事件B 提交事件
time4: 事件A再次读取的数据
事件A两次读取的 结果的数据集 差别
事件隔离级别

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

创建user表
  1. CREATE TABLE `user` (
  2.   `id` int NOT NULL,
  3.   `name` varchar(10) COLLATE utf8mb3_bin DEFAULT NULL,
  4.   PRIMARY KEY (`id`)
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin;
复制代码
插入数据
  1. INSERT INTO `user` (`id`, `name`)
  2. VALUES
  3.   (1, '小红'),
  4.   (2, '小绿'),
  5.   (4, '小蓝'),
  6.   (10, '小黄');
复制代码
开启两个命令行界面 左边为命令行1 右边为命令行2

读未提交 (Read Uncommitted)

由于读未提交隔离界别下不能办理任何并发事件问题,所以这里只展示脏读的场景。
脏读:

读已提交 (Read Committed)

办理脏读:此时命令行1隔离级别为读已提交 (Read Committed)

不可重复读:

可重复读 (Repeatable Read)mysql默认级别

办理不可重复度:此时命令行1隔离级别为可重复读 (Repeatable Read)

幻读:可重复读 (Repeatable Read) ,通过了 MVCC(多版本并发控制) 办理了大部分的幻读。(之后的文章会具体介绍什么是MVCC 和 锁)

串行化 (Serializable)

办理幻读:此时命令行1隔离级别为串行化 (Serializable)

总结

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表