mysql事务(代码片段)

水月情缘雪飞飞 水月情缘雪飞飞     2022-10-24     492

关键词:

@[TOC]Mysql事务

简介

事务四大特征(ACID)

推荐: https://blog.csdn.net/lianghecai52171314/article/details/102782804

原子性:事务是最小单位,不可再分,例如:update … insert … delete …

一致性:所有的DML语句操作,必须同时成功或者同时失败

隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read
committed)、可重复读(repeatable read)和串行化(Serializable)。

持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

事务的4个级别

隔离级别:

隔离级别脏读(Dirty Read)不可重复读(NonRepeatable Read)幻读(Phantom Read)
未提交读(READ-UNCOMMITTED)
已提交读(READ-COMMITTED)
可重复读(REPEATABLE-READ)[默认级别]
串行化(SERIALIZABLE )

脏读,幻读,不可重复读

脏读[脏数据](Dirty Read): 两个事务,一个事务未提交的数据(commit),另一个事务可以读取到.

不可重复读(NonRepeatable Read):事务A在修改数据,事务B在事务A 数据(修改前)和(修改后),未提交(commit)前,两次读取的数据不一致。

幻读(Phantom Read):是指多个事务执行时发生的一种现象。事务A新增或删除了数据,但是未提交(commit),事务B发现新增或删除的数据,就像幻觉一样。

备注

不可重复读的重点是修改:

同样的条件,你读取过的数据,再次读取出来发现值不一样了

幻读的重点在于新增或者删除:

同样的条件,第 1 次和第 2 次读出来的记录数不一样

查询与设置隔离级别

查询会话事务级别

# mysql 查询会话级别
select @@transaction_isolation; # 查询当前的会话事务级别 
select @@global.transaction_isolation; # 查询全局的事务隔离级别
show variables like 'transaction_isolation';


# 8.0以下版本,8.0之后版本废弃
select @@tx_isolation;  # 查询当前的会话事务级别 
select @@global.tx_isolation; # 查询全局的事务隔离级别

+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+

设置事务级别

# 未提交读  read uncommitted级别:
set session transaction isolation level read uncommitted;

# 已提交读 read committed级别:
set session transaction isolation level read committed;

# 可重复读 repeatable read级别:
set session transaction isolation level repeatable read;

# 可串行化 serializable级别:
set session transaction isolation level serializable;

# 开始事务
begin; 
start transaction; 
# 提交事务
commit; 
# 回滚
rollback;   

示例测试数据

初始化数据表

-- 登录mysql
-- mysql -u root -h 127.0.0.1 -p

-- 创建数据库
-- create database testdb;

use testdb;
drop table if exists user;
CREATE TABLE `user`(
    `id`   int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(255) NOT NULL DEFAULT '' COMMENT '名字',
    `num`  int(11) NOT NULL DEFAULT 0 COMMENT '数量',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 初始数据
INSERT INTO `user` (`name`,`num`) VALUES ('one',0),('two',0),('three',0);

select * from user;
+----+-------+-----+
| id | name  | num |
+----+-------+-----+
|  1 | one   |   0 |
|  2 | two   |   0 |
|  3 | three |   0 |
+----+-------+-----+

未提交读

事务A事务B
无事务
备注
set session transaction isolation level read uncommitted;

begin;


设置事务级别
开启事务

set session transaction isolation level read uncommitted;

begin;
set session transaction isolation level read uncommitted;

select * from user; 

idnamenum
1one0
2two0
3three0



原始数据

INSERT INTO `user` (`name`,`num`) VALUES ('four',0);


UPDATE user SET num=10 where id=1;


DELETE FROM user where id=3;


select * from user;

idnamenum
1one10
2two0
4four0






select * from user; 

idnamenum
1one10
2two0
4four0

脏读

事务A数据未提交但是事务B可以读取




select * from user; 

idnamenum
1one10
2two0
4four0


虽然未启用事务,但是依然课读取到脏数据

commit; (事物提交)

idnamenum
1one10
2two0
4four0




rollback; (事物回滚,无操作)

idnamenum
1one10
2two0
4four0




select * from tb;

idnamenum
1one10
2two0
4four0

已提交读

事务A事务B
无事务
备注
set session transaction isolation level read committed;

begin;
set session transaction isolation level read committed;

begin;
set session transaction isolation level read committed;设置事物级别
开启事物

select * from user; 

idnamenum
1one0
2two0
3three0


INSERT INTO `user` (`name`,`num`) VALUES ('four',0);


UPDATE user SET num=10 where id=1;


DELETE FROM user where id=3;


select * from user;

idnamenum
1one10
2two0
4four0






select * from user; 

idnamenum
1one0
2two0
3three
0

看不见事务A数据修改



select * from user; 

idnamenum
1one0
2two0
3three0



commit; (事物提交)


idnamenum
1one10
2two0
4four0


事物A提交

select * from user; 

idnamenum
1one10
2two0
4four0



不可重复读,

数据被修改,读取到已提交的数据。


幻读(一种现象),

第一次查询可以看见3,第二次查询3被删除,查询到了4,行不一样了


rollback; (事物回滚,无操作)





select * from user; 

idnamenum
1one10
2two0
4four0

可重复读

事务A事务B
无事务
备注
set session transaction isolation level repeatable read;

start transaction;
set session transaction isolation level repeatable read;

start transaction;
set session transaction isolation level repeatable read;设置事物级别
开启事物


select * from user; 

idnamenum
1one0
2two0
4four0


INSERT INTO `user` (`name`,`num`) VALUES ('four',0);


UPDATE user SET num=10 where id=1;


DELETE FROM user where id=3;


select * from user;

idnamenum
1one10
2two0
4four0






select * from user; 

idnamenum
1one0
2two0
3three
0

看不见数据修改



select * from user; 

idnamenum
1one0
2two0
3three0



commit; (事物提交)


idnamenum
1one10
2two0
4four0




select * from user; 

idnamenum
1one0
2two0
3three0



未查询到修改,避免 不可重复读取 ,


UPDATE user SET num=num+20 where id=1;


select * from user; 

idnamenum
1one30
2two0
3three0



更新后id=1的值为30,


在可重复读的隔离级别下,MySQL采用的是MVCC机制,select 操作不会更新版本号,是快照读(历史版本);而insert、update和delete会更新版本号,是当前读(当前版本)


commit; (事务提交)

idnamenum
1one30
2two0
4four0

结束后发现最新数据


select * from user; 

idnamenum
1one30
2two0
4four0

串行化

事务A事务B
无事务
备注
set session transaction isolation level serializable;

start transaction;
set session transaction isolation level serializable;

start transaction;
set session transaction isolation level serializable;设置事物级别
开启事物

INSERT INTO `user` (`name`,`num`) VALUES ('four',0);


UPDATE user SET num=10 where id=1;


DELETE FROM user where id=3;


select * from user;

idnamenum
1one10
2two0
4four0






select * from user; 


等待 事物A 执行。。。






select * from user; 

idnamenum
1one0
2two0
3three0



commit; (事物提交)


idnamenum
1one10
2two0
4four0




事物A 等待结束,开始执行语句。。。

idnamenum
1one10
2two0
4four0



最新数据


rollback; (事物回滚,无操作)

idnamenum
1one10
2two0
4four0




select * from user; 

idnamenum
1one10
2two0
4four0

mysql事务(代码片段)

文章目录二、MySQL事务2.1、事务的概念2.2、事务的ACID特点①原子性(Atomicity)②一致性(Consistency)③隔离性(Isolation)ⅰ查询全局事务隔离级别:ⅱ查询会话事务隔离级别ⅲ设置全局事务隔离级别ⅳ... 查看详情

mysql的事务详解(代码片段)

...ySQL✨一句短话:难在坚持,贵在坚持,成在坚持!文章目录一.事务的业务场景二.事务的使用三.事务的特性(ACID)1.原子性(Atomicity)2.一致性(Consistency)3.持久性(Durability)4.隔离性(Isolation)四.事务并发异常1.脏读2.不可重复读3.幻读四.MySQL的... 查看详情

mysql事务隔离与spring(代码片段)

Spring学习事务的时候看到很多只读事务和事务隔离和事务传播和事务挂起,为了更好的理解学习了mysql这块的知识。本文用的SQL命令#------设置事务隔离登记-----#读已提交setsessiontransactionisolationlevelreadcommitted;#读未提交setsessiont... 查看详情

mysql的事务和引擎,注意细品(代码片段)

mysql事务和引擎一、MySQL事务(一)、MySQL事务的概念(二)、事务的ACID特点1、ACID特点2、数据不一致产生的结果:(三)、事务的隔离1、MySQL事物隔离级别1.1查询全局事务隔离级别1.2查询会话事务隔离级别1.3设... 查看详情

深入剖析mysql事务和spring事务(代码片段)

本文分享一些关于Mysql如何解决多事务并发的问题和Spring源码是怎么控制事务以及一些事务失效的场景。分享内容Mysql事务隔离机制锁机制MVCC多版本并发控制隔离机制Spring事务应用和源码分析事务失效问题一、Mysql事务数据库的... 查看详情

mysql事务隔离(代码片段)

阅读目录事务的介绍隔离级别1READUNCOMMITTED(未提交读)2READCOMMITTED(提交读)3REPEATABLEREAD(可重复读)SERIALIZABLE(可串行化)事务隔离的实现事务启动的方式事务的介绍事务就是一组原子性的sql查询,或者说是一个独立的工作单元。简... 查看详情

[mysql]事务acid详解(代码片段)

...历代表过去,能力代表现在,学习能力代表未来! 目录 1. 事务的概念2.事务的特性3.事务控制语法4.事务并发异常5.事务隔离级别1. 事务的概念事务指逻辑上的一组操作,组成这组操作的各个单元,除非全部正确执 查看详情

mysql—事务(代码片段)

事务一、事务的基本介绍概念:如果一个包含多个步骤的业务操作被事务管理,那么这些操作要么同时成功,要么同时失败操作:开启事务:starttransaction回滚:rollback提交:commitMySQL数据库中事务默认... 查看详情

mysql—事务(代码片段)

事务一、事务的基本介绍概念:如果一个包含多个步骤的业务操作被事务管理,那么这些操作要么同时成功,要么同时失败操作:开启事务:starttransaction回滚:rollback提交:commitMySQL数据库中事务默认... 查看详情

mysql:管理mysql事务(代码片段)

...户端,真正的MySQL服务器程序是mysqld,在后台运行.数据库事务具有ACID特性,用来保证多条SQL的全部执行。五、MySQL通过mysql命令行登录MySQLClient的可执行程序是mysql,MySQLServer的可执行程序是mysqld。MySQLClient和MySQLServer的关系如下:... 查看详情

重新整理mysql基础篇—————mysql事务[三](代码片段)

前言简单整理一下事务。正文事务有四大特性:1.原子性(atomicity)一个事务必须被视为一个不可分割的最小单元。2.一致性(consistency)数据库总是从一个一致性的状态转换到另一个一致性的状态。很多人对事务的一致性和原子性可能... 查看详情

mysql(十七)——事务(代码片段)

17.事务17.1什么是事务17.2与事务相关的语句17.3事务机制的存在价值17.4事务的执行过程17.5提交事务和回滚事务17.6事务的4个特性17.7事务的隔离性17.8验证各种隔离级别17.事务17.1什么是事务  一个事务其实就是一个完整的业务逻... 查看详情

mysql事务(代码片段)

@[TOC]Mysql事务简介事务四大特征(ACID)推荐:https://blog.csdn.net/lianghecai52171314/article/details/102782804原子性:事务是最小单位,不可再分,例如:update…insert…delete…一致性:所有的DML语句操作,必须 查看详情

mysql事务(代码片段)

@[TOC]Mysql事务简介事务四大特征(ACID)推荐:https://blog.csdn.net/lianghecai52171314/article/details/102782804原子性:事务是最小单位,不可再分,例如:update…insert…delete…一致性:所有的DML语句操作,必须 查看详情

mysql事务测试(代码片段)

setautocommit=0;--1开启自动提交事务0关闭自动提交事务1.读未提交:没有提交的事务修改数据也能读到,会产生->脏读setsessiontransactionisolationlevelreaduncommitted;(如果一个事务未提交然后回滚,另一个事务读取回未... 查看详情

mysql-09-笔记(代码片段)

事务事务TRANSACTION1.事务的概念2.事务的数据准备3.未管理事务演示4.管理事务演示5.事务的提交方式6.事务的四大特征(ACID)7.事务的隔离级别8.事务隔离级别演示9.隔离级别总结10.事务的总结事务TRANSACTION1.事务的概念一条或多条SQL语... 查看详情

mysql事务的实现原理(代码片段)

《深入理解分布式事务》第二章MySQL事务的实现原理文章目录《深入理解分布式事务》第二章MySQL事务的实现原理一、RedoLog1.RedoLog基本概念2.RedoLog基本原理3.RedoLog刷盘规则4.RedoLog写入机制5.RedoLog的LSN机制6.RedoLog相关参数二、UndoLog... 查看详情

mysql----事务transaction(代码片段)

事务初识事务事务提交方式自动提交手动提交事务操作方式及测试操作测试事务隔离级别初步理解(同时对于一致性的理解)隔离级别相关操作读未提交【ReadUncommitted】读提交【ReadCommitted】可重复读【RepeatableRead】串行化【serializab... 查看详情