MySQL事务操作全解析
在MySQL中,事务(Transaction)用于确保一组SQL操作要么全部成功执行,要么全部回滚(撤销)。以下是MySQL事务的常用操作及说明:
1. 开启事务
方式一:显式开启
START TRANSACTION; -- 标准写法
-- 或
BEGIN; -- 简化写法
方式二:关闭自动提交(隐式开启)
SET autocommit = 0; -- 关闭自动提交(后续每条SQL需手动提交)
2. 提交事务
将事务中的操作永久保存到数据库:
COMMIT;
3. 回滚事务
撤销事务中的所有操作,恢复到事务开始前的状态:
ROLLBACK;
4. 设置保存点(Savepoint)
在事务中标记一个回滚点,用于部分回滚:
SAVEPOINT savepoint_name; -- 创建保存点
ROLLBACK TO savepoint_name; -- 回滚到指定保存点
RELEASE SAVEPOINT savepoint_name; -- 删除保存点
5. 设置事务隔离级别
控制事务间的可见性(解决脏读、幻读等问题):
SET TRANSACTION ISOLATION LEVEL level;
-- 可选级别:
-- READ UNCOMMITTED
-- READ COMMITTED
-- REPEATABLE READ(MySQL默认)
-- SERIALIZABLE
示例:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
6. 检查事务状态
- 查看当前是否在事务中:
SELECT @@in_transaction; -- 返回1表示在事务中
- 查看自动提交状态:
SELECT @@autocommit; -- 返回1表示自动提交开启
7. 锁机制(事务中常用)
- 共享锁(读锁):
SELECT ... LOCK IN SHARE MODE;
- 排他锁(写锁):
SELECT ... FOR UPDATE;
完整事务示例
-- 1. 开启事务
START TRANSACTION;-- 2. 执行操作
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;-- 3. 判断是否成功(业务逻辑)
IF (一切正常) THENCOMMIT; -- 提交事务
ELSEROLLBACK; -- 回滚事务
END IF;
关键注意事项
- 存储引擎支持:
仅InnoDB
引擎支持事务(MyISAM不支持)。 - 自动提交模式:
默认autocommit=1
(每条SQL自动提交),需显式关闭才能启用多语句事务。 - 隐式提交:
执行CREATE TABLE
、ALTER TABLE
等DDL语句会隐式提交当前事务。 - 隔离级别影响:
不同隔离级别对并发性能和数据一致性有直接影响(需根据业务选择)。
事务流程总结
掌握这些操作能有效保证数据库操作的原子性和一致性,适用于转账、订单处理等关键业务场景。