事物管理.

引入

在这里插入图片描述

CURD满足什么属性,能解决上述问题?

  1. 买票的过程得是原子的吧
  2. 买票互相应该不能影响吧
  3. 买完票应该要永久有效吧
  4. 买前,和买后都要是确定的状态吧

什么是事务?

在这里插入图片描述

为什么会出现事务

在这里插入图片描述

事务的版本支持

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务, MyISAM 不支持。

查看数据库引擎

在这里插入图片描述

事务提交方式

事务的提交方式常见的有两种:

  • 自动提交

  • 手动提交

    • 查看事务提交方式
      在这里插入图片描述
    • 用 SET 来改变 MySQL 的自动提交模式:
      在这里插入图片描述

事务常见操作方式

  • 提前准备
    在这里插入图片描述

  • 创建测试表
    在这里插入图片描述

  • 正常演示 - 证明事务的开始与回滚
    在这里插入图片描述

  • 非正常演示1 - 证明未commit,客户端崩溃,MySQL自动会回滚(隔离级别设置为读未提交)
    在这里插入图片描述

  • 非正常演示2 - 证明commit了,客户端崩溃,MySQL数据不会在受影响,已经持久化
    在这里插入图片描述

  • 非正常演示3 - 对比试验。证明begin操作会自动更改提交方式,不会受MySQL是否自动提交影响
    在这里插入图片描述

  • 非正常演示4 - 证明单条 SQL 与事务的关系
    在这里插入图片描述

  • 总结
    在这里插入图片描述

事务隔离级别

如何理解隔离性

在这里插入图片描述

隔离级别

在这里插入图片描述

查看与设置隔离性

在这里插入图片描述

读未提交【Read Uncommitted】

在这里插入图片描述

读提交【Read Committed】

在这里插入图片描述

可重复读【Repeatable Read】

在这里插入图片描述

串行化【serializable】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

一致性(Consistency)

在这里插入图片描述

推荐阅读

https://www.jianshu.com/p/398d788e1083
https://tech.meituan.com/2014/08/20/innodb-lock.html
https://www.cnblogs.com/aspirant/p/9177978.html
  • update,insert,delete之间是会有加锁现象的,但是select和这些操作是不冲突的。这就是通过读写锁(锁有行锁或者表锁)+MVCC完成隔离性。

理解隔离性2

数据库并发的场景有三种

在这里插入图片描述

读-写

在这里插入图片描述

3个记录隐藏列字段

在这里插入图片描述
在这里插入图片描述
上面描述的意思是:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对应源码策略:
在这里插入图片描述
在这里插入图片描述
此时版本链是:
在这里插入图片描述

  • 只有事务4修改过该行记录,并在事务2执行快照读前,就提交了事务。
    在这里插入图片描述
  • 我们的事务2在快照读该行记录的时候,就会拿该行记录的 DB_TRX_ID 去跟
    在这里插入图片描述

RR 与 RC的本质区别

在这里插入图片描述
关于读-读与写-写自己去了解

推荐阅读

https://blog.csdn.net/SnailMann/article/details/94724197
https://www.cnblogs.com/f-ck-need-u/archive/2018/05/08/9010872.html
https://blog.csdn.net/chenghan_yang/article/details/97630626

猜你喜欢

转载自blog.csdn.net/weixin_54183294/article/details/130914383