MySQL事务及其原理

事务是一组操作的集合,这组集合要么同时成功,要么同时失败

MySQL事务默认是自动提交的,也就是说每一条sql语句就是一条事务

查看/设置事务提交方式

关闭自动提交只有在其所在的查询窗口有效

sql 复制代码
select @@autocommit;   --查看提交方式
SET @@autocommit = 0;  -- 关闭自动提交
SET @@autocommit = 1;  -- 开启自动提交(默认)

提交事务/回滚事务

关闭自动提交后,只有提交事务,修改才真正到数据库

sql 复制代码
COMMIT;  -- 提交事务

ROLLBACK;  -- 回滚事务

开启事务

START TRANSACTION;

事务的控制有两种方式

  1. 关闭事务自动提交
  2. 开启事务

事务四大特性(ACID)

  • 原子性:要么都成功要么都失败
  • 一致性:数据保持一致
  • 隔离性:不受其他并发操作影响
  • 持久性:事务提交或回滚对数据库中数据的改变是永久的

并发事务问题

  1. 脏读​:一个事务读取到其他事务未提交的数据
  2. ​不可重复读​:同一事务内多次读取同一数据结果不同,由于另一个事务提交了修改事务
  3. ​幻读​:一个事务按条件查询数据时,没有对应的数据行,但在插入数据时,又发现这行数据已经存在了(被另一个事务插入并提交了),好像出现了幻影
  4. ​更新丢失​:两个事务同时更新同一数据,后提交的覆盖先提交的

事务的隔离级别

MySQL支持四种事务隔离级别:

  1. ​读未提交(Read Uncommitted)​:最低级别,可能读取到未提交的数据(脏读)
  2. ​读已提交(Read Committed)​Oracle默认级别,只能读取已提交的数据,但可能出现不可重复读
  3. ​可重复读(Repeatable Read)​MySQL默认级别,保证同一事务多次读取结果一致
  4. ​串行化(Serializable)​:最高级别,完全串行执行,避免所有并发问题。一个事务执行完后才能执行下一个事务

查看事务隔离级别

sql 复制代码
-- 查看全局隔离级别
SELECT @@global.transaction_isolation;

-- 查看当前会话隔离级别
SELECT @@transaction_isolation;

设置事务隔离级别

sql 复制代码
--设置当前会话事务隔离级别

SET SESSION TRANSACTION ISOLATION LEVEL level_name;

--其中level_name可以是以下四种之一:
--READ UNCOMMITTED (读未提交)
--READ COMMITTED (读已提交)
--REPEATABLE READ (可重复读,MySQL默认级别)
--SERIALIZABLE (串行化)

两个客户端设置隔离级别,两个开启事务,当隔离级别为Read Uncommitted时,A事务可以读到B事务还没提交的数据。

两个客户端设置隔离级别,两个开启事务,当隔离级别为Repeatable Read时,A事务读到的数据不会改变,B改变了数据并提交了,只有A在提交事务后查询才能看见被B修改的数据

事务原理

原子性、一致性、持久性由innoDB存储引擎底层两份日志实现的undo log、redo log

隔离性由innoDB存储引擎的锁机制,MVCC实现的

redo log重做日志-实现一致性

执行操作时,先去缓冲池里找有没有对应的数据

没有,缓冲池通过后台线程从磁盘中读取出来,再会缓存到内存buffer pool中

然后直接操作缓冲池中的数据,缓冲池中的数据发生了变更,但是磁盘中的数据还没有,

这是缓冲池中的数据页叫脏页,脏页在一定时机通过后台线程刷新回磁盘。这样缓存和磁盘中的数据就保持了一致。

但是脏页刷新不是实时的,是有一段时间的,如果刷新出现问题

redo log :在对缓存池中的数据叶操作时,首先将操作记录到redolog中,再持久化到磁盘中

undo log回滚日志-实现原子性

记录数据被修改前的信息,作用还包括:事务执行失败时提供回滚,MVCC多版本并发控制

当执行delete时,记录insert。当执行update时,记录一条反向update语句

相关推荐
NCIN EXPE4 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台4 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路4 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家4 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE4 小时前
开启mysql的binlog日志
数据库·mysql
yejqvow125 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
oLLI PILO5 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
m0_743623925 小时前
HTML怎么创建多语言切换器_HTML语言选择下拉结构【指南】
jvm·数据库·python
pele5 小时前
Angular 表单中基于下拉选择动态启用字段必填校验的完整实现
jvm·数据库·python