事务就是一组应该一起成功或一起失败的sql语句
事务具有四个属性(ACID):
原子性:所有的sql语句要么全部成功,要么全部失败,不会存在部分更新。
一致性:事务只能以允许的方式改变受其影响的数据。
隔离性:同时发生的事务(并发事务)不应该导致数据库处于不一致的状态中。系统中每个事务都应该像唯一事务一样执行。任何事务都不应影响其他事务的存在。
持久性:无论数据库或系统是否发生故障,数据都会永久保存在磁盘上,并且不会丢失。
执行事务
先创建一个示例表并插入数据:
create TABLE account( account_number VARCHAR(10) PRIMARY KEY, balance INT ); INSERT INTO account VALUES (‘A‘,600),(‘B‘,400);
要启动一个事务(一组sql),请执行start transaction 或 begin 语句
BEGIN; SELECT balance INTO @a.bal FROM account WHERE account_number = ‘A‘ UPDATE account SET balance = @a.bal-100 WHERE account_number = ‘A‘; SELECT balance INTO @b.bal FROM account WHERE account_number = ‘B‘ ; UPDATE account SET balance = @b.bal + 100 WHERE account_number = ‘B‘;
把A账户的100块转移到B账户
最后执行commit语句,该语句将完成事务并提交数据
COMMIT;
如果希望事务中止,可以用 rollback 语句
默认情况下,autocommit 的状态是 on ,这意味着所有单独的语句一旦被执行就会被提交,除非该语句在 begin---commit 块中。
如果 autocommit 的状态是 off,则需要明确发出 commit 语句来提交事务。
要禁用 autocommit,可以执行
mysql > set autocommit = 0 ;
DDL语句,如数据库的create或drop语句,以及表或存储例程的 create 、drop或alter语句,都是无法回滚的。
事务存档
使用保存点可以回滚到事务中的某些点,而且无须中止事务。
方法:(1)使用 savepoint 标识符为事务保存点命名
(2)使用 rollback to 将事务回滚到指点的保存点而不中止事务
下面示例是假设账户A想向B、C账户转账,但是C不存在,于是将事务回滚给B转账之后
BEGIN; SELECT balance INTO @a.bal FROM account WHERE account_number = ‘A‘; UPDATE account SET balance = @a.bal-100 WHERE account_number = ‘A‘; SELECT balance INTO @b.bal FROM account WHERE account_number = ‘B‘ ; UPDATE account SET balance = @b.bal + 100 WHERE account_number = ‘B‘; SAVEPOINT transfer_to_b; SELECT balance INTO @a.bal FROM account WHERE account_number = ‘A‘; UPDATE account SET balance = balance + 100 WHERE account_number = ‘C‘; ROLLBACK TO transfer_to_b; COMMIT;
原文:https://www.cnblogs.com/wubenbenxi/p/11048254.html