目录
- 引入
- CURD满足什么属性,能解决上述问题?
- 什么是事务?
- 为什么会出现事务
- 事务的版本支持
- 事务提交方式
- 事务常见操作方式
- 事务隔离级别
- 如何理解隔离性
- 隔离级别
- 查看与设置隔离性
- 读未提交【Read Uncommitted】
- 读提交【Read Committed】
- 可重复读【Repeatable Read】
- 串行化【serializable】
- 一致性(Consistency)
- 推荐阅读
- 理解隔离性2
- 数据库并发的场景有三种
- 读-写
- 3个记录隐藏列字段
- RR 与 RC的本质区别
- 推荐阅读
引入
CURD满足什么属性,能解决上述问题?
- 买票的过程得是原子的吧
- 买票互相应该不能影响吧
- 买完票应该要永久有效吧
- 买前,和买后都要是确定的状态吧
什么是事务?
为什么会出现事务
事务的版本支持
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务, MyISAM 不支持。
查看数据库引擎
事务提交方式
事务的提交方式常见的有两种:
-
自动提交
-
手动提交
-
- 查看事务提交方式
- 查看事务提交方式
-
- 用 SET 来改变 MySQL 的自动提交模式:
- 用 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