筒霓暄
2025-10-1 13:15:06
事务是数据库管理系统的核心特性,它确保数据库操作要么完全成功,要么完全失败,保持数据的一致性和完整性。
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;
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
|
|
|
相关推荐
|
|