Mysql事务

一、事务定义

  • 事务(Transaction):一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务
  • 一个完整的业务需要批量DML(数据操纵语言 insert、update、delete) 语句共同联合完成
  • 事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同

二、事务的四大特性(ACID)

  • Automicity:原子性,事务是最小的执行单位,不允许分割。
  • Consistency:一致性,数据库从一个正确的状态变化到另一个正确的状态;
  • Isolation:隔离性,并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的
  • Durability:持久性,一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

三、事务开启的标志?事务结束的标志?

开启标志

  • 任何一条DML语句(insert、update、delete)执行

结束标志(提交或回滚)

  • 提交:成功的结束,将所有的DML语句操作历史记录和底层硬盘数据来一次同步
  • 回滚:失败的结束,将所有DML语句操作历史记录全部清空

四、事务和底层数据

mysql实现事务是根据undo日志和redo日志实现的

undo:记录修改前的状态,rollback基于undo实现

redo:记录修改后的状态,commit基于redo实现

无论是否开启事务,都会立刻执行,只是开启事务后将执行结果保存在redo中,commit之后才写入磁盘

五、事务提交与回滚

mysql默认情况下,事务是自动提交的,也就是说只要执行了一条DML语句就开启了事务,并且提交了事务

自动提交机制是可以关闭的

在这里插入图片描述

开启事务

在这里插入图片描述

回滚事务

在这里插入图片描述

mysql中begin和start transaction区别

begin或start transaction 都是显式开启一个事务,是等价的;

commit 或commit work都是等价的;

rollback或rollback work 也是等价的;

六、事务产生的问题和事务的隔离界别

事务同时执行出现的问题

  1. 脏读:事务A读取了B更新的数据,然后B回滚事务A读取到的就是脏数据
  2. 不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致前后结果不一致。
  3. 幻读:A管理员将学生按照分数分为ABCDE,B管理员在A操作完全部数据之后发现有一条记录没操作,好像出现幻觉一样。

总结:不可重复读侧重修改,幻读侧重新增和删除。不可重复读要符合条件的行数据,幻读要锁表

事务的隔离级别

  • 读未提交:一个事务还没提交时,它做的变更就能被别的事务看到。
  • 读提交(Orlace默认级别):一个事务提交之后,它做的变更才会被其他事务看到。解决脏读
  • 可重复读(mysql默认级别):事务不会读到其它事务提交的修改(一开始读到什么,最后也读到什么)解决脏读、不可重复读
  • 串行化:解决了脏读、不可重复读、幻读,相当于单进程,效率低下。

七、事物的作用范围

事务隔离级别作用范围有2种:

  • 全局级别(global):对所有会话有效
  • 会话级别(session):只对当前会话有效

八、设置事务隔离级别

SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL <isolation-level>
GLOBAL:代表设置全局事务级别
SESSION:代表设置会话事务级别

isolation-level:可以是
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE

设置会话隔离级别为READ COMMITTED↓
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
或
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;


设置全局隔离级别为READ COMMITTED↓
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

九、查看事务隔离级别

查看会话隔离级别
select @@tx_isolation;
show variables like '%isolation%';


查看全局隔离级别
select @@global.tx_isolation;

十、开小灶

spring开启事务和mysql开启事务不一致时会怎样?

答案:以spring事务为主

redis事务和mysql事务的区别?

1.事务指令

Mysql:begin、commit、rollback

Redis:multi(标记事务开始)、exec(执行commands队列)、discard(结束事务,并消除commands队列)
在这里插入图片描述在这里插入图片描述

2.事务底层实现

Mysql基于undo日志和redo日志

  • undo日志实现了rollback操作
  • redo日志实现了commit操作

Redis基于Commands队列实现

3.事务默认状态

Mysql默认开启

无论是否开启事务,都会马上执行命令,只是开启事务后将状态存入redo日志,commit后才写入磁盘

Redis默认关闭

  • 没开启事务:立即执行并返回结果,直接写入内存
  • 开启事务:不会立刻执行,排入队列,并返回队列状态,调用exec才会执行commands中的命令

4.事务是否支持回滚

Mysql支持回滚 Redis不支持回滚,

可以使用WATCH去监听key在事务发生之前是否被修改,若被修改则回滚

在这里插入图片描述

WATCH

在这里插入图片描述

UNWATCh(取消所有监视)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iEqGx4Vu-1616000147670)(8FA7977130034E36948556E1DC8CB580)]

5.事务是否原子性

mysql事务是原子性的,关系型数据库中的事务都是原子性的

在这里插入图片描述

redis命令是原子性的,事务不是原子性的

  1. 若事务队列中存在命令错误(类似java编译性错误),执行exec,所有命令都不会执行
  2. 若事务中存在语法错误(类似java 1/0的运行时异常),执行 exec,正确命令会被执行,错误命令抛出异常
演示1:

在这里插入图片描述

演示2

在这里插入图片描述

参考文章:
MySQL——事务(Transaction)详解
彻底搞懂 Redis 事务

  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值