系列目录
一、引子
在第一节中我们知道spring为了支持数据库事务的ACID四大特性,在底层源码中对事务定义了6个属性:事务名称、隔离级别、超时时间、是否只读、传播机制、回滚机制。其中隔离级别和传播机制光看第一节的描述还是不够的,需要实际测试一下方能放心且记忆深刻。
二、环境
2.1 业务模拟
模拟用户去银行转账,用户A转账给用户B,
需要保证用户A扣款,用户B加款同时成功或失败回滚。
2.2 环境准备
测试环境:
mysql8+mac,测试时使用的mysql8(和mysql5.6的设置事务变量的语句不同,不用太在意)
测试准备:
创建一个数据库test,创建一张表user_balance用户余额表。id主键,name姓名,balance账户余额。
1 mysql> create database test;
2 Query OK, 1 row affected (0.05 sec) 3 4 mysql> use test; 5 Database changed 6 mysql> CREATE TABLE `user_balance` ( 7 -> `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID主键', 8 -> `name` varchar(20) DEFAULT NULL COMMENT '姓名', 9 -> `balance` decimal(10,0) DEFAULT NULL COMMENT '账户余额', 10 -> PRIMARY KEY (`id`) 11 -> ) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8; 12 Query OK, 0 rows affected, 1 warning (0.15 sec)
初始化数据,2个账户都是1000元:
mysql> INSERT INTO `user_balance` VALUES ('1', '张三', '1000'), ('2', '李四', '1000'); Query OK, 2 rows affected (0.06 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from user_balance;
+----+--------+---------+ | id | name | balance | +----+--------+---------+ | 1 | 张三 | 1000 | | 2 | 李四 | 1000 | +----+--------+---------+ 2 rows in set (0.00 sec)