事务原则与实现

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

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 导航 一. 事务的原则 二. SQL实现数据库事务管理 三. JDBC实现事务管理 一. 事务的原则 事务的描述事...
    asfafjwefhfuer阅读 3,130评论 0 0
  • 事务,一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元。这些单元要...
    圣贤与无赖阅读 3,538评论 0 0
  • 一、(了解)定义 全称(Transaction Control Language)翻译成中文 事务控制语言,事务是...
    唯老阅读 4,143评论 0 2
  • 1、什么是事务 MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你...
    一如既往wfqwfq阅读 1,081评论 0 0
  • 一、(了解)定义 全称(Transaction Control Language)翻译成中文 事务控制语言,事务是...
    任未然阅读 1,544评论 0 0

友情链接更多精彩内容