哈,好久没写笔记了,最近闲来无事和大家分享一些 Mysql 事务方面的小知识吧!
- 嗯~~ 关于事务的介绍就不写了,网上资料太多了,大家获取起来很方便!我比较务实,直接进入主题吧,介绍一点关键性的东西 (其实是因为懒,手动滑稽)
【1-0】: 首先事务的界定
一个完整的事务需满足如下四个特性,也就是我们常说的 'ACID'
- '原子性(Atomicity)'
- '一致性(Consistency)'
- '隔离性(Isolation)'
- '持久性(Durability)'
【1-1】: 事务设置
查询当前事务隔离级别
'mysql> select @@tx_isolation; '
修改事务隔离级别
(方法1): 'mysql> set 执行方式 transaction isolation level 隔离级别;'
(方法2): 'my.cnf或my.ini配置文件中mysqld下添加 transaction-isolation = 隔离级别'
[解释:执行方式]
'global' 设置后将影响之后所有的session,而当前已经存在的session不会受到影响。
'session' 设置后将影响之后所有的session,包括当前正在运行的session 【推荐】
[解释:隔离级别]
'read uncommitted' 读未提交
'read committed' 读已提交
'repeatable' 可重复读
'serializable' 可串行化
【1-2】: 隔离级别差异对比
读未提交: 脏读(√) 不可重复读(√) 幻读(√)
读已提交: 脏读(×) 不可重复读(√) 幻读(√)
可重复读: 脏读(×) 不可重复读(×) 幻读(√)
可串行化: 脏读(×) 不可重复读(×) 幻读(×)
[解释:脏读]
'最简单的理解, 假设一个查询语句读取到了另外一条还未提交的事务修改后数据
(万一你回滚了我咋办)'
[解释:幻读]
'假设事务A执行了一条SQL(select * from xxx where sum > 10) 此时结果为空,
事务B执行了另外一条SQL (update xxx set sum = 11) ,并完成提交
事务A在执行(update xxx set xxx = xxx where sum > 10 ), 会发现有1条数据被更新了'
[解释:不可重复读]
'假设事务A执行的一条查询SQL此时得到的结果为2, 事务B执行了一条修改SQL
将记录改成了1并提交了, 此时事务A实际拿到的值就成1了'