验证[mysql]的REPEATABLE-READ隔离级别对于update操作的影响

隔离级别略过不讲。

1、准备工作

初始化数据:
 

CREATE TABLE `t_tran` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

MariaDB [aliyun01]> select * from t_tran;
+----+------+------+
| id | a    | b    |
+----+------+------+
|  1 |    1 |    10 |
|  2 |    2 |    2 |
|  3 |    3 |    3 |
+----+------+------+

开启事务:
ariaDB [aliyun01]> start transaction;
Query OK, 0 rows affected (0.00 sec)

2、验证

 事务A 事务B
T1select * from t_tran;
        (id=1,b=10)
 
T2 

 select * from t_tran;

(id=1,b=10)

T3update t_tran set b=b-10 where id=1 and b>=10; 
T4

select * from t_tran;

(id=1,b=0)

select * from t_tran;

(id=1,b=10)

T5 

update t_tran set b=b-10 where id=1 and b>=10;

// 开始等待

T6commit;执行完毕,影响行数0
T7

select * from t_tran;

(id=1,b=0)    

select * from t_tran;

(id=1,b=10)

T8 commit;
T9

select * from t_tran;

(id=1,b=0)

select * from t_tran;

(id=1,b=10)

3、总结:

事务执行期间,insert的数据,对其他事务不可见。

场景一:
1、事务A对数据X进行update后,在commit之前,事务B对数据X的修改会进入等待。
2、事务A进行commit操作
3、事务B等待结束开始执行时,如果事务A对数据x的修改-不满足B的修改条件,则B执行的数据update无效(执行影响行数为0)
4、事务B在commit前,看不到事务A对数据X的修改

场景二:
1、事务A对数据X进行update后,在commit之前,事务B对数据X的修改会进入等待。
2、事务A进行commit操作
3、事务B等待结束开始执行时,如果事务A对数据x的修改-满足B的修改条件,则B执行的数据update成功,并且结果是事务A和事务B先后对数据X更改的最后结果
4、事务B在commit前,事务A看不到事务B对数据X的修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值