
image.png

image.png
例子来看一下事务的四大特性
张三给李四转100元,中间有两个事务
张三减100元
李四加100元

image.png
创建数据库
/*
Navicat Premium Data Transfer
Source Server : localhost
Source Server Type : MySQL
Source Server Version : 50560
Source Host : localhost:3306
Source Schema : dist_tran_course
Target Server Type : MySQL
Target Server Version : 50560
File Encoding : 65001
Date: 09/12/2019 13:36:53
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`amount` bigint(20) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
创建表
INSERT INTO `dist_tran_course`.`t_user`(`id`, `username`, `amount`) VALUES (1, 'SuperMan', 100);
INSERT INTO `dist_tran_course`.`t_user`(`id`, `username`, `amount`) VALUES (2, 'BatMan', 100);
开启事务的执行
START TRANSACTION
UPDATE t_user SET amount = amount + 100 WHERE username = 'SuperMan';
UPDATE t_user SET amount = amount - 100 WHERE username = 'SuperMan';
COMMIT;
-- 查看全局和当前session的事务隔离级别
SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
-- 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
-- level:
READ UNCOMMITTED, 脏读,第一次读和第二次读是不一样的
READ COMMITTED, 第一次读和第二次读是不样的,可以读取到其它事务已经提交的数据状态
REPEATABLE READ, 默认第一次和第二次读都是一样的,可重复读,读取不到其它事务已经提交的状态
SERIALIZABLE 线性读取
-- session 1:
START TRANSACTION;
UPDATE t_user SET amount = amount + 100 WHERE username = 'BatMan';
UPDATE t_user SET amount = amount - 100 WHERE username = 'SuperMan';
COMMIT;
-- ROLLBACK;
-- session 2:
START TRANSACTION;
SELECT * FROM t_user
COMMIT;
#REPEATABLE-READ 可重复读: 当前事务比较长,在当前事务没有结束时,查询到的数据一直是第一次查询到的数据结果
例如事务A和事务B,同事对一条数据进行操作,事务B在事务A之前执行,事务A在事务B结束前查询到了数据,事务A对当前数据进行了修改,并事务已经提交结束,事务B查询到的这个数据还是最初修改前的数据状态
当前事务没有结束读取不到,其它事务已经结束的状态。
START TRANSACTION
select * from t_user;
select * from t_user where username = 'SuperMan';
COMMIT;
UNCOMMITTED
重复读:可以读取其它没有结束的数据状态