MySQL 事务学习笔记
什么是事务
事务是指一组被视为单个逻辑工作单元的操作,必须作为一个整体进行,要么全部成功完成,要么全部失败回滚。在MySQL数据库中,事务是指一组SQL语句经过逻辑上的一致性操作,要么完全执行,要么完全不执行。
实例说明
下面通过一个实例来说明事务的使用方法和注意事项。
假设我们有一个银行账户表(account)和一个记录交易流水的表(transaction),它们的结构如下:
Copy CodeCREATE TABLE account (
id INT PRIMARY KEY,
balance DECIMAL(10,2)
);
CREATE TABLE transaction (
id INT PRIMARY KEY,
account_id INT,
amount DECIMAL(10,2),
trans_time DATETIME
);
现在,我们需要编写一个转账的存储过程(transfer),将一笔金额从一个账户转移到另一个账户,并记录交易流水。
Copy CodeDELIMITER $$
CREATE PROCEDURE transfer(
IN from_acc INT,
IN to_acc INT,
IN amount DECIMAL(10,2)
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
END;
START TRANSACTION;
UPDATE account SET balance = balance - amount WHERE id = from_acc;
UPDATE account SET balance = balance + amount WHERE id = to_acc;
INSERT INTO transaction (account_id, amount, trans_time)
VALUES (from_acc, -(amount), NOW());
INSERT INTO transaction (account_id, amount, trans_time)
VALUES (to_acc, amount, NOW());
COMMIT;
END$$
DELIMITER ;
在该存储过程中,我们首先定义了一个异常处理程序,用于在出现异常时回滚事务。然后,我们使用START TRANSACTION语句开启一个新事务,并依次更新账户余额表和记录交易流水表。最后,通过COMMIT语句提交该事务。
需要注意的是,在执行转账存储过程时,需要保证from_acc和to_acc两个账户都存在且from_acc账户余额大于等于转账金额。否则,该事务将回滚,不会执行任何修改操作。
结论
MySQL的事务功能可以确保一组SQL语句的原子性、一致性、隔离性和持久性。在编写事务时,应该注意异常处理和事务的范围,避免造成不必要的数据损失。