网站页面引导怎么做,建设小微公司网站需要多少钱,做网站灵宝,做网站是怎么回事前言
本文讲述MySQL中的事务#xff0c;以账户转账为例#xff0c;体会事务的概念#xff0c;并讲解事务相关的一个关键字用法#xff1a;savepoint
示例
数据准备
drop table if exists account;create table account(id int primary key AUTO_INCREMENT comment ID,n…前言
本文讲述MySQL中的事务以账户转账为例体会事务的概念并讲解事务相关的一个关键字用法savepoint
示例
数据准备
drop table if exists account;create table account(id int primary key AUTO_INCREMENT comment ID,name varchar(10) comment 姓名,money double(10,2) comment 余额
) comment 账户表;insert into account(name, money) VALUES (张三,2000), (李四,2000);未控制事务 | 转账正常
-- 1. 查询张三余额
select * from account where name 张三;
-- 2. 张三的余额减少1000
update account set money money - 1000 where name 张三;
-- 3. 李四的余额增加1000
update account set money money 1000 where name 李四;所有SQL正常执行没有出错。结果就是张三账户余额-1000李四账户余额1000
未控制事务 | 异常情况
-- 1. 查询张三余额
select * from account where name 张三;
-- 2. 张三的余额减少1000
update account set money money - 1000 where name 张三;-- 手动写一行错误的SQL语句
select xxx xxx;-- 3. 李四的余额增加1000
update account set money money 1000 where name 李四;只有前两个SQL执行了第三个SQL没有执行出现数据不一致了张三的钱减少了但是李四的钱没有增加
控制事务 | 示例
mysql START TRANSACTION; # 开启事务
Query OK, 0 rows affected (0.00 sec)mysql select * from account where name 张三; # 展示张三账户金额
---------------------
| id | name | money |
---------------------
| 1 | 张三 | 2000.00 |
---------------------
1 row in set (0.00 sec)mysql update account set money money - 1000 where name 张三; # 将张三账户金额减少1000
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql update account set money money 1000 where name 李四; # 将李四账户金额增加1000
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql select * from account where name 张三; # 查询张三账户金额在事务里看金额确实少了。但是数据库里面账户值还没变
---------------------
| id | name | money |
---------------------
| 1 | 张三 | 1000.00 |
---------------------
1 row in set (0.00 sec)mysql COMMIT; # 上述操作均成功提交事务修改生效。若某一操作失败需要回滚COMMIT改为ROLLBACK
Query OK, 0 rows affected (0.00 sec)mysql select * from account where name 张三;
---------------------
| id | name | money |
---------------------
| 1 | 张三 | 1000.00 |
---------------------
1 row in set (0.00 sec)上述操作过程大致三个步骤开启事务、执行一组SQL语句、提交或回滚事务。
事务开启方式
针对开启事务这一步有如下几种方式
# 方式1关闭隐式事务
SELECT autocommit;
SET autocommit 0;# 方式2手动开启事务
START TRANSACTION;# 方式3手动开启事务-另一种
BEGIN;针对提交或回滚事务这一步是看上数SQL操作是否都成功。若都成功则提交若有失败则回滚使数据恢复到修改前的状态
COMMIT; # 若SQL语句执行正常提交事务ROLLBACK; # 若SQL语句有执行异常回滚事务若是要用一个sql脚本来处理一组事务则应该在提交或者回滚这一步加上判断条件
# 开始事务
BEGIN;#执行一组SQL
xxxxxx# 提交或回滚
if(所有SQL执行成功) THENCOMMIT;
ELSEROLLBACK;
END IF;复杂的事务处理过程通常可以借助第三方工具例如脚本语言Python、PHP等。
事务相关关键字 | savepoint
savepoint关键字可以使得回滚事务的时候只混滚部分代码处理的结果。
如下是关于savepoint的大概作用流程
# 开启事务
xxx# 一组SQL
xxx修改操作1
xxx修改操作2
SAVEPOINT change1;
xxx查询操作1
xxx查询操作2出问题报错了# 因为修改操作都完成了在查询结果是否正确的时候出了错误就可以通过这样只回滚change1到ROLLBACK TO change1之间的代码
ROLLBACK TO change1;# ROLLBACK如果不加TO就会回滚到初始位置不管是否有savepoint
# 若是不想要某个savepoint点可以删除
RELEASE SAVEPOINT change1;