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

MySQL事务

事务是数据库管理系统的核心特性,它确保数据库操作要么完全成功,要么完全失败,保持数据的一致性和完整性。

1、事务基础概念

1.1 什么是事务?

事务是一组原子性的 SQL 操作,这些操作要么全部执行成功,要么全部失败回滚。事务将数据库从一种一致状态转换为另一种一致状态。

1.2 ACID 特性

特性 描述 实现机制
原子性 (Atomicity) 事务不可分割,要么全部成功,要么全部失败 Undo Log
一致性 (Consistency) 事务使数据库从一个有效状态转换到另一个有效状态 应用层 + 数据库约束
隔离性 (Isolation) 并发事务相互隔离,互不干扰 锁机制 + MVCC
持久性 (Durability) 事务提交后,修改永久保存 Redo Log

2、MySQL 事务操作

2.1 事务控制语句

-- 开启事务
START TRANSACTION;  -- 或 BEGIN-- 提交事务
COMMIT;-- 回滚事务
ROLLBACK;-- 设置保存点
SAVEPOINT savepoint_name;-- 回滚到保存点
ROLLBACK TO savepoint_name;-- 释放保存点
RELEASE SAVEPOINT savepoint_name;

2.2 事务模式设置

-- 查看事务自动提交状态
SHOW VARIABLES LIKE 'autocommit';  -- 默认ON-- 禁用自动提交
SET autocommit = 0;-- 启用自动提交
SET autocommit = 1;

2.3 完整事务示例

START TRANSACTION;-- 账户A扣款
UPDATE accounts SET balance = balance - 1000 WHERE account_id = 'A';-- 账户B收款
UPDATE accounts SET balance = balance + 1000 WHERE account_id = 'B';-- 验证余额
SELECT balance FROM accounts WHERE account_id = 'A' FOR UPDATE;-- 根据业务逻辑决定提交或回滚
IF (SELECT balance FROM accounts WHERE account_id = 'A') >= 0 THENCOMMIT;
ELSEROLLBACK;
END IF;

3、事务隔离级别

3.1 并发问题

问题 描述 示例
脏读 读取到未提交的数据 事务A读取事务B未提交的修改
不可重复读 同一事务内多次读取结果不同 事务A两次读取间数据被事务B修改
幻读 同一查询返回不同行数 事务A查询期间事务B插入新行

3.2 隔离级别对比

隔离级别 脏读 不可重复读 幻读 性能 实现机制
READ UNCOMMITTED 最高 无锁
READ COMMITTED 行锁
REPEATABLE READ (MySQL默认) MVCC+间隙锁
SERIALIZABLE 最低 表锁

3.3 设置隔离级别

-- 查看当前隔离级别
SELECT @@transaction_isolation;-- 设置会话级隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;-- 设置全局级隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
http://www.gsyq.cn/news/180.html

相关文章:

  • Python面向对象
  • buntu22.04 LTS安装docker以及docker-compose实践
  • 20分钟快速入门Docker
  • K8S的基础概念
  • 如何搭建K8S集群
  • 解决 .NET 7 在 Linux 上获取程序集的问题
  • MyBatis-Plus 实现PostgreSQL数据库jsonb类型的保存与查询
  • katalon常用定位元素Xpath合集
  • (期望)名字(name)
  • MathType7下载安装2025最新下载+安装+教程(附安装包)
  • 模板 AE PR 达芬奇 剪影
  • 如何自动删除重复执行的任务?
  • 开始更新第一篇
  • springboot~SpringData自定义Repository的正确方式
  • Linux之进程状态
  • 2. O(NlogN)的排序
  • React-手写支持多文件、并行上传、串行上传、分片上传、单文件上传、失败自动重试、自动上传/手动按钮上传切换
  • postcss-px-to-viewport-8-plugin无法转换tailwindcss样式问题
  • 82、SpringMVC 参数传递,浏览器和服务器之间的数据传输
  • 问卷调查数据库设计
  • Linux 系统调用详解与工作机制
  • The 2025 Sichuan Provincial Collegiate Programming Contest
  • 详细介绍:Android 热点开发的相关api总结
  • 十大经典排序算法 - lucky
  • 基于Operator方式和二进制方式部署prometheus环境
  • 27家网省
  • 使用DeepState进行API模糊测试的技术解析(第二部分)
  • Linux 进程管理之软硬限制以及企业应用实践
  • 智能血压计芯片解决方案AI版
  • MySQL约束