跳转至
用户认证 - eMac Tech Docs

用户认证

重要提醒

为了您的权益以及学习体验,请不要外借账号!

如果您没有账号或忘记密码,请联系管理员重置密码。

请输入您的登录信息

MySQL事务处理

事务概述

1. 什么是事务

flowchart TD
    A[开始] --> B[开始事务]
    B --> C[执行SQL操作]
    C --> D{所有操作成功?}
    D -->|是| E[提交事务]
    D -->|否| F[回滚事务]
    E --> G[结束]
    F --> G

事务是数据库操作的基本单位,是一组原子性的SQL语句,要么全部执行成功,要么全部执行失败。

2. 事务的特性(ACID)

  • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成
  • 一致性(Consistency):事务执行前后,数据库从一个一致状态变为另一个一致状态
  • 隔离性(Isolation):并发事务之间互不影响
  • 持久性(Durability):事务一旦提交,其结果就是永久性的

事务实现

1. 事务控制语句

-- 开始事务
START TRANSACTION;
-- 或
BEGIN;

-- 提交事务
COMMIT;

-- 回滚事务
ROLLBACK;

-- 设置保存点
SAVEPOINT point_name;

-- 回滚到保存点
ROLLBACK TO point_name;

2. 事务示例

-- 转账事务示例
START TRANSACTION;

UPDATE accounts SET balance = balance - 100 
WHERE account_id = 1;

UPDATE accounts SET balance = balance + 100 
WHERE account_id = 2;

-- 检查余额是否足够
SELECT balance FROM accounts WHERE account_id = 1;

-- 如果余额足够,提交事务
COMMIT;
-- 如果余额不足,回滚事务
-- ROLLBACK;

事务隔离级别

1. 隔离级别说明

隔离级别 脏读 不可重复读 幻读
READ UNCOMMITTED 可能 可能 可能
READ COMMITTED 不可能 可能 可能
REPEATABLE READ 不可能 不可能 可能
SERIALIZABLE 不可能 不可能 不可能

2. 设置隔离级别

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

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

-- 设置全局隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

事务并发控制

1. 锁机制

-- 共享锁(读锁)
SELECT * FROM accounts WHERE account_id = 1 LOCK IN SHARE MODE;

-- 排他锁(写锁)
SELECT * FROM accounts WHERE account_id = 1 FOR UPDATE;

2. 死锁处理

-- 查看死锁信息
SHOW ENGINE INNODB STATUS;

-- 设置死锁超时
SET innodb_lock_wait_timeout = 50;

事务最佳实践

1. 事务设计原则

  • 事务要尽可能短
  • 避免在事务中进行远程调用
  • 避免在事务中进行大量数据操作
  • 合理设置事务隔离级别

2. 性能优化

-- 设置自动提交
SET autocommit = 1;

-- 设置事务超时
SET innodb_lock_wait_timeout = 50;

-- 设置死锁检测
SET innodb_deadlock_detect = ON;

注意事项

  1. 事务管理

    • 事务大小控制
    • 超时处理
    • 死锁预防
    • 错误处理
  2. 性能考虑

    • 并发控制
    • 锁等待
    • 事务日志
    • 资源消耗
  3. 运维管理

    • 监控告警
    • 性能分析
    • 故障处理
    • 数据恢复
  4. 重要参数

    • innodb_lock_wait_timeout
    • innodb_deadlock_detect
    • transaction_isolation
    • autocommit