事务原则与实现

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

重复读:可以读取其它没有结束的数据状态

你可能感兴趣的:(事务原则与实现)