当前位置: 首页 > article >正文

高效处理数据的一把钥匙:探索MySQL事务机制

事务的概念

在 MySQL 中,事务是一组操作的集合,这些操作要么全部成功执行,要么全部不执行。

事务的特性

MySQL 通过以下四个特性来保证事务的可靠性,这被称为 ACID 原则:

  1. 原子性 AtomicityAtomicity:一个事务中的所有操作要么全部完成,要么完全不执行。如果其中一个操作失败,整个事务将被回滚到开始之前的状态。
  2. 一致性 ConsistencyConsistency:事务必须使数据库从一个一致性的状态转变到另一个一致性的状态。在事务开始和结束时,数据库都应该处于有效状态。
  3. 隔离性 IsolationIsolation:并发执行的事务之间是相互独立的,一个事务的执行不应受到其他并发事务的影响。不同级别的隔离可以控制这种影响。
  4. 持久性 DurabilityDurability:一旦事务提交,其结果是永久性的,即使系统崩溃也不会丢失。

事务的版本支持

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务, MyISAM 不支持。

事务的提交方式

提交方式

  • 手动提交
  • 自动提交

查看事务的提交方式

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.41 sec)

用 SET 来改变 MySQL 的自动提交模式:

mysql> SET AUTOCOMMIT=0; #SET AUTOCOMMIT=0 禁止自动提交
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT=1; #SET AUTOCOMMIT=1 开启自动提交
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.01 sec)

事务操作注意事项

  • 如果没有设置保存点,也可以回滚,只能回滚到事务的开始。直接使用 rollback(前提是事务还没有提交)
  • 如果一个事务被提交了(commit),则不可以回退(rollback)
  • 可以选择回退到哪个保存点
  • InnoDB 支持事务, MyISAM 不支持事务
  • 开始事务可以使 start transaction 或者 begin

事务的隔离级别

读未提交(READ UNCOMMITTED)

  • 允许一个事务读取另一个未提交事务的数据。
  • 可能会导致“脏读”(Dirty Read),即读取到不一致的数据。

读已提交(READ COMMITTED)

  • 一个事务只能读取到已经提交的事务所做的修改。
  • 可以避免脏读,但仍然可能发生“不可重复读”(Non-repeatable Read),即在同一事务中多次读取相同数据时,结果可能不同

可重复读(REPEATABLE READ)

  • 确保在同一事务内多次读取相同的数据结果是一样的,即使其他事务对这些数据进行了修改。
  • 避免了脏读和不可重复读,但可能会出现“幻影读”(Phantom Read),即在查询范围内插入新行后,再次执行查询时发现结果集有所不同。
  • MySQL 的默认隔离级别就是可重复读。

串行化(SERIALIZABLE)

  • 最严格的隔离级别,确保每个事务都像是按顺序执行的一样。
  • 可以避免所有类型的问题,包括脏读、不可重复读和幻影读。但性能开销较大,因为它通常需要加锁来防止并发访问。

设置隔离级别

-- 设置当前会话的隔离级别为可重复读
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 设置全局隔离级别为串行化
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;

查询当前隔离级别

-- 查看当前会话的隔离级别
SELECT @@session.tx_isolation;
-- 查看全局的隔离级别
SELECT @@global.tx_isolation;

http://www.kler.cn/a/378491.html

相关文章:

  • 低代码用户中心:简化开发,提升效率的新时代
  • (蓝桥杯C/C++)—— 编程基础
  • P11233 [CSP-S 2024] 染色 题解
  • jmeter脚本-请求体设置变量and请求体太长的处理
  • 什么是虚拟dom,如何实现一个虚拟dom
  • Go语言常见数据结构实现原理
  • Linux 练习三
  • scp免密上传文件
  • 华为OD机试 - 字符串分割(二) - 双指针(Python/JS/C/C++ 2024 C卷 100分)
  • [ vulnhub靶机通关篇 ] 渗透测试综合靶场 Corrosion1 通关详解 (附靶机搭建教程)
  • 基于Spring Boot + Vue的气象智慧监测系统设计与实现
  • python读word中的表格和插入表格
  • 电子电气架构 --- Trace 32(劳特巴赫)多核系统的调试
  • Freertos学习日志(1)-基础知识
  • 11.1组会汇报-基于区块链的安全多方计算研究现状与展望
  • 【原创分享】详述中间件的前世今生
  • .Net Framework里演示怎么样使用StringBuilder、Math.Min和String.Format
  • c# 实现文件更新通知
  • JavaEE-多线程初阶(1)
  • MySQL-基础汇总
  • 知识见闻 - Workday公司介绍
  • springboot 基于google 缓存,实现防重复提交
  • 掌握ElasticSearch(六):分析过程
  • linux当中用到的系统调用和库函数
  • elementUI tabs 吸顶功能实现,拉到最底部时候点击tab 回到最初位置
  • 【若依框架】代码生成详细教程,15分钟搭建Springboot+Vue3前后端分离项目,基于Mysql8数据库和Redis5,管理后台前端基于Vue3和Element Plus,开发小程序数据后台