事务-----mysql
在MySQL中,事务是通过一组SQL语句组成的逻辑工作单元,这些语句要么全部成功执行,要么全部失败回滚。定义一个事务通常包括以下步骤:
-
开始事务:使用
START TRANSACTION
或BEGIN
语句来开始一个新的事务。 -
执行SQL语句:在事务中执行一系列的SQL操作(如
INSERT
、UPDATE
、DELETE
等)。 -
提交或回滚事务:
-
如果所有操作都成功,使用
COMMIT
语句提交事务,使更改永久生效。 -
如果任何操作失败,使用
ROLLBACK
语句回滚事务,撤销所有更改。
-
具体步骤
1. 开始事务
使用START TRANSACTION
或BEGIN
语句来开始一个新的事务。
START TRANSACTION; -- 或者 BEGIN;
2. 执行SQL语句
在事务中执行一系列的SQL操作。例如:
UPDATE accounts SET balance = balance - 200 WHERE name = 'Alice'; UPDATE accounts SET balance = balance + 200 WHERE name = 'Bob';
3. 提交或回滚事务
-
提交事务:如果所有操作都成功,使用
COMMIT
语句提交事务。sql
复制
COMMIT;
-
回滚事务:如果任何操作失败,使用
ROLLBACK
语句回滚事务。sql
复制
ROLLBACK;
示例
假设我们有一个accounts
表,结构如下:
CREATE TABLE accounts ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, balance DECIMAL(10, 2) NOT NULL );
表中插入两条记录:
INSERT INTO accounts (name, balance) VALUES ('Alice', 1000.00); INSERT INTO accounts (name, balance) VALUES ('Bob', 500.00);
现在,Alice要向Bob转账200元。这个操作需要两个步骤:
-
从Alice的账户中扣除200元。
-
向Bob的账户中增加200元。
我们可以使用事务来确保这两个操作要么全部成功,要么全部失败:
START TRANSACTION; -- 从Alice的账户中扣除200元 UPDATE accounts SET balance = balance - 200 WHERE name = 'Alice'; -- 向Bob的账户中增加200元 UPDATE accounts SET balance = balance + 200 WHERE name = 'Bob'; -- 提交事务 COMMIT;
如果在事务执行过程中发生错误,比如Alice的余额不足,我们可以回滚事务,撤销所有操作:
START TRANSACTION; -- 从Alice的账户中扣除200元 UPDATE accounts SET balance = balance - 200 WHERE name = 'Alice'; -- 检查Alice的余额是否足够 SELECT balance INTO @alice_balance FROM accounts WHERE name = 'Alice'; IF @alice_balance < 0 THEN -- 如果余额不足,回滚事务 ROLLBACK; ELSE -- 向Bob的账户中增加200元 UPDATE accounts SET balance = balance + 200 WHERE name = 'Bob'; -- 提交事务 COMMIT; END IF;
自动提交模式
MySQL默认处于自动提交模式(autocommit=1
),即每条SQL语句都会自动提交。要使用事务,通常需要禁用自动提交模式:
SET autocommit = 0;
禁用自动提交后,必须显式地使用COMMIT
或ROLLBACK
来结束事务。
总结
定义一个事务的基本步骤包括开始事务、执行SQL语句、提交或回滚事务。通过使用事务,可以确保一组操作要么全部成功,要么全部失败,从而保证数据库的一致性和完整性。