隔离级别略过不讲。
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的修改。