17.编写一个事务需要掌握的语法

在MySQL默认命令行设置下,事务都是自动提交的,这就意味着单独执行SQL后就会马上执行提交操作。
如果我们要取消自动提交,我们可以采用两种方式:
1).关闭自动提交设置
在 MySQL 中,可以使用 SET autocommit 语句设置事务的自动提交模式,语法格式如下:

SET autocommit = 0|1|ON|OFF;

对取值的说明:
值为 0 和值为 OFF:关闭事务自动提交。如果关闭自动提交,用户将会一直处于某个事务中,只有提交或回滚后才会结束当前事务,重新开始一个新事务。
值为 1 和值为 ON:开启事务自动提交。如果开启自动提交,则每执行一条 SQL 语句,事务都会提交一次。

2).显示开启一个事务

start transaction;

1.编写事务必须掌握的语法

通过前面的学习,我们知道如何将MySQL自动提交改为手动提交。

1)下面正式学习重要语法

START TRANSACTION 显示开启一个事务
COMMIT 提交事务
ROLLBACK 回滚前面已经执行事务,它和COMMIT不可同时执行
SAVEPOINT point 创建保存点
RELEASE SAVEPOINT point 删除保存点
ROLLBACK TO point 回滚到保存点位置,注意:即使执行了这个,也要执行ROLLBACK 或COMMIT来结束事务
SET TRANSACTION 设置事务的隔离级别
COMMIT WORK 提交事务,但它和COMMIT是有区别的,COMMIT WORK用来控制事务结束后的行为
是CHAIN还是RELEASE的,如果是CHAIN方式,那么事务就变成了链事务。用户可以通过参数completion_type来进行控制,
默认该参数为0,表示没有任何操作,在这种设置下,COMMIT和COMMIT WORK是完全等价的。
当参数completion_type的值为1时,COMMIT WORK等同于COMMIT AND CHAIN,表示马上自动开启一个相同隔离级别的事务。
当参数completion_type为2时,COMMIT WORK 等同于COMMIT AND RELEASE,当事务提交后会自动断开与服务器的连接。

注意:InnoDB存储引擎中的事务都是原子的,这说明下述两种情况:构成事务的每条语句都会提交(成为永久),或者所有语句都回滚。这种保护还延伸到单个语句中。一条语句要么完全提交成功,要么完全回滚(语句回滚)。因此一条语句失败并抛出异常并不会导致前面已经执行的语句自动回滚。所以必须由用户自己来决定是否对其进行提交或回滚操作。

2)实例学习

首先从创建一张表:并插入两条数据

create table bank(
internal_key int(11) auto_increment,
uname varchar(20) ,
baseAcctId varchar(50),
balance decimal(17,2),
primary key(internal_key)
);
insert into bank(uname,baseAcctId,balance) values('yanjd','88888888',100000000);
insert into bank(uname,baseAcctId,balance) values('yanjl','99999999',0);

然后下面我们使用事务进行下面的操作:
A.yanjd给yanjl转账100块(使用提交)

START TRANSACTION;
update bank set balance=balance-100 where baseAcctId='88888888';
update bank set balance=balance+100 where baseAcctId='99999999';
COMMIT;

执行前后结果:
在这里插入图片描述

B.但是如果我们执行下面语句(使用回滚):

START TRANSACTION;
update bank set balance=balance-100 where baseAcctId='88888888';
update bank set balance=balance+100 where baseAcctId='99999999';
ROLLBACK;

执行前:

在这里插入图片描述

执行后:
在这里插入图片描述

C.下面我们执行下面语句(使用保存点)

START TRANSACTION;
update bank set balance=balance-100 where baseAcctId='88888888';
SAVEPOINT time1;
update bank set balance=balance+100 where baseAcctId='99999999';
ROLLBACK TO time1;

然后单独执行commit
会发现:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/c1776167012/article/details/121387755