筒霓暄 发表于 2025-10-1 13:15:06

MySQL事务

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

1.1 什么是事务?

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

特性描述实现机制原子性 (Atomicity)事务不可分割,要么全部成功,要么全部失败Undo Log一致性 (Consistency)事务使数据库从一个有效状态转换到另一个有效状态应用层 + 数据库约束隔离性 (Isolation)并发事务相互隔离,互不干扰锁机制 + MVCC持久性 (Durability)事务提交后,修改永久保存Redo Log2、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 THEN
    COMMIT;
ELSE
    ROLLBACK;
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;
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

哈梨尔 发表于 4 天前

前排留名,哈哈哈
页: [1]
查看完整版本: MySQL事务