MySQL 事务学习笔记

什么是事务

事务是指一组被视为单个逻辑工作单元的操作,必须作为一个整体进行,要么全部成功完成,要么全部失败回滚。在MySQL数据库中,事务是指一组SQL语句经过逻辑上的一致性操作,要么完全执行,要么完全不执行。

实例说明

下面通过一个实例来说明事务的使用方法和注意事项。

假设我们有一个银行账户表(account)和一个记录交易流水的表(transaction),它们的结构如下:

Copy Code
CREATE 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 Code
DELIMITER $$ 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语句的原子性、一致性、隔离性和持久性。在编写事务时,应该注意异常处理和事务的范围,避免造成不必要的数据损失。