验证[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
T1 select * from t_tran;
        (id=1,b=10)
 
T2  

 select * from t_tran;

(id=1,b=10)

T3 update 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;

// 开始等待

T6 commit; 执行完毕,影响行数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的修改。

你可能感兴趣的:(数据库)