MySQL攻略 - MySQL事务详解、事务隔离级别测试

事务基本介绍与使用

事务用于保证数据的一致性,它由一组相关的dml(增删改)语句组成,该组的dml语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性。

回退事务

在介绍回退事务前,先介绍一下保存点(savepoint).保存点是事务中的点.用于取消部分事务,当结束事务时(commit),会自动的删除该事务所定义的所有保存点.当执行回退事务时,通过指定保存点可以回退到指定的点

提交事务

使用commit语句可以提交事务.当执行了commit语句子后,会确认事务的变化、结束事务、删除保存点、释放锁,数据生效。当使用commit语句结束事务子后,其它会话【其他链接】将可以查着到事务变化后的新数据【所有数据就正式生效

思路图解析(图)

请添加图片描述

事务和锁

当执行事务操作时(dml语句),mysql会在表上加锁,放置其他用户改表的数据。这对用户来讲是非常重要的

基本操作

mysql数据库控制台事务的几个重要操作

  1. start transaction --开始一个事务
  2. savepoint 保存点名 --设置保存点
  3. rollback to 保存点名 --回退事务
  4. rollback --回退全部事务
  5. commit --提交事务,所有的操作生效,不能回退

事务操作(图)

请添加图片描述

代码模拟

-- 演示
-- 1.创建一张测试表
create table t1
		(id int,
		`name` varchar(32));
		
-- 2.开启事务
start transaction;

-- 3.设置保存点
savepoint a;
-- 执行dml操作
insert into t1 values(100,'tom');
select * from t1;

-- 设置保存点2
savepoint b;
-- 执行dml操作
insert into t1 values(200,'jack');
select * from t1;

-- 回滚到b
rollback to b;

-- 回滚到 a
rollback to a;
select * from t1;

-- 回退到事务开始状态
rollback;

-- 所有事务生效,commit,则不能回滚
commit;


细节

  1. 如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
  2. 如果开始一个事务,你没有创建保存点,你可以执行 rollback,默认就是回退到你事务开始的状态
-- 如果开始一个事务,你没有创建保存点,你可以执行rollback
-- 默认就是回退到你事务开始的状态
start transaction;
insert into t1 values(100,'taotao');
insert into t1 values(200,'guiugi');

-- 回退
ROLLBACK;
select * from t1;
  1. 你也可以在这个事务中(还没有提交时),创建多个保存点,比如:savepoint aaa;执行dml,save point bbb;

  2. 你可以在事务没有提交前,选择回退到哪个保存点

  3. mysql的事务没有提交前,选择回退到哪个保存点

  4. 开始一个事务start transaction,set autocommit = off;

start transaction;
-- 或者
set autocommit = off;
  1. InnoDB 存储引擎支持事务,MyISAM不支持

MySQL事务隔离级别

概念

Mysql隔离级别定义了事务与事务之间的隔离程度

隔离级别介绍

  1. 多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性
  2. 如果不考虑隔离性,可能会引发如下问题:

脏读(dirty read)

当一个事务读取另一个事务尚未提交的修改时,产生脏读

不可重复读(nonrepeatable read)

同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读

幻读(phantom read)

同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读

4种事务隔离级别(表格)

Mysql隔离级别(4种)脏读不可重复读幻读加锁读
读未提交(read uncommitted)不加锁
读已提交(read committed)×不加锁
可重复读(Repeatable read)×××不加锁
可串行化(Serializable)【演示重开客户端】×××加锁

√表示可能出现,x表示不会出现

案例演示

请添加图片描述

-- 演示mysql的事务隔离级别

-- 1.开了两个mysql的控制台
-- 2.查看当前mysql的隔离级别
-- select @@tx_isolation;

-- mysql > select @@tx_isolation;
select @@tx_isolation;
-- +-----------------+
-- | @@tx_isolation  |
-- +-----------------+
-- | REPEATABLE-READ |
-- +-----------------+

-- 3.把其中一个控制台的隔离级别设置 Read uncommitted
set session transaction isolation level read uncommitted;
-- +------------------+
-- | @@tx_isolation   |
-- +------------------+
-- | READ-UNCOMMITTED |
-- +------------------+

-- 4.创建表
create table `account`(
		id int,
		`name` varchar(32),
		money int);
)

-- 5.更改为“读已提交”
set session transaction isolation level read committed;

-- 6.更改为“可重复读”
set session transaction isolation level repeatable read;

-- 7.更改为“可串行化”
set session transaction isolation level serializable;
读未提交(产生脏读)

数据紊乱

请添加图片描述

读已提交(未产生脏读)

请添加图片描述

读已提交(产生幻读)

请添加图片描述

可重复读(什么都不产生)

请添加图片描述

当我测试端提交事务后,方可查询到

可串行化(锁)

注意

  1. 事务隔离只限制事务开启时查询,当事务提交后不在有隔离级别
1.查看当前会话隔离级别
- 这是8.0之前的版本语句
select @@tx_isolation;

- 8.0之后用
select @@transaction_islation;
2.查看系统当前隔离级别
- 这是8.0之前的版本语句
select @@global.tx_isolation;

- 8.0之后用
select @@global.transaction_islation;
3.设置当前会话隔离级别
set session transaction isolation level repeatable read;
4.设置系统当前隔离级别
set global transaction isolation level repeatable read;
5.Mysql默认的事务隔离级别

repeattable read,一般情况下,没有特殊要求,没有必要修改(因为该级别可以满足绝大部分项目需求)

默认隔离级别修改

全局修改,修改my.ini配置文件,在最后加上

-- 可选参数有:read-uncommitted,read-committed,repeatable-read,serializable
[mysqld]
transaction-isolation = repeatable-read

事务的ACID特性(了解)

1.原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

2.一致性(Consistency)

事务必须使数据库从一个一致性状态变换到另外一个一致性状态

3.隔离性(lsolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离

4.持久性(Durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据发生故障也不应该对其有任何影响

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼鬼骑士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值