首页 > 数据库技术 > 详细

mysql事务

时间:2019-06-18 23:21:59      阅读:181      评论:0      收藏:0      [点我收藏+]

事务就是一组应该一起成功或一起失败的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;

 

mysql事务

原文:https://www.cnblogs.com/wubenbenxi/p/11048254.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!