整体思维导图
MySql事务效果
隔离性与隔离级别
- 读未提交
- 读提交
- 可重复读
- 幻读
一个表开启两个事务来演示一下
- 第一步:新建一个表,建表语句:
create table T(c int) engine=InnoDB;
- 第二步: 在表中插入数据:
create table T(c int) engine=InnoDB;
- 第三步:演示步骤
相关配置
查看隔离级别:
show variables like 'transaction_isolation';
隔离级别的原理-多版本并发控制(MVCC)
事务在更新的时候保存回滚记录
-
记录上最新的值,通过回滚操作,都可以得到前一个状态值
-
每个事务在回滚的时候都只需要回滚到自己记录的状态值就可以了
-
什么时候删除这个回滚记录呢?
- 就是当系统里没有比这个回滚日志更早的 read-view 的时候。 以Read-viewB 为例, 当read-viewA 事务提交, 并且Read-viewB事务也提交的时候,Read-viewB就可以删了
不建议出现长事务
- 不建议出现长事务的原因有一个很重要的原因就是会保留大量的回滚日志
- 长事务还会占用锁资源–这个以后聊
事务启动方式
显示手动开启
- begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback。
自动提交事务
-
查询是否自动提交事务
show session variables like 'autocommit';
show global variables like 'autocommit';
- Value的值为ON,表示autocommit开启。OFF表示autocommit关闭。
-
修改autocommit模式
- 关闭自动提交:
set session autocommit=0;
- 开启自动提交:
set global autocommit=0;
- 关闭自动提交:
-
非自动提交下的问题
-
一个事务开启之后,没有提交,第二个事务一旦开启会自动将第一个事务提交
-
复现过程如下
-
第一步: 会话一:将自动提交设置为0:
set session autocommit=0;
-
第二步: 会话一: 执行一条SQL如:
DELETE from T WHERE c >100;
-
第三步: 会话二: 查询当前长事务:
-
-
- SELECT a.trx_state,
b.event_name,
a.trx_started,
b.timer_wait / 1000000000000 timer_wait,
a.trx_mysql_thread_id blocking_trx_id,
b.sql_text
FROM information_schema.innodb_trx a,
performance_schema.events_statements_current b,
performance_schema.threads c
WHERE a.trx_mysql_thread_id = c.processlist_id
AND b.thread_id = c.thread_id;
- 第四步: 会话一: 开启一个新的事务:START TRANSACTION;
- 第五步: 会话二:在次查询当前长事务
猿来衣舍
这是博主开的淘宝小店,主要经营舒适保暖的服饰,有袜子、主题卫衣、保暖衣。欢迎大家选购。
我们也在着手开发脚手架,到时候会做为商店福利的赠送给老用户
打开淘宝搜索 “猿来衣舍”这四个字就可以搜到小店,希望大家多多支持。
一个人能够走多远,关键在于与谁同行,我用跨越山海的一路相伴,希望得到您用金钱的称赞。