MySQL事务
先来看一个例子有一张balance表:
文章插图
需求:将tom的100块钱转到King账户中
【day08-MySQL事务】执行的操作是:
update balance set money = money -100 where id = 100 update balance set money = money +100 where id = 200
这时,如果第一条语句执行成功,但第二条语句执行失败,就会出现问题 。这里引出一个需求,将多个dml语句(update,insert,delete)当做一个整体,要么全部成功,要么全部失败
--->使用事务来解决
1.什么是事务
- 什么是事务
- 事务和锁
- mysql数据库控制台事务的几个重要操作(基本操作)
文章插图
注意:当直接回退到保存点a时,会删除中间的保存点b
1.start transaction --开始一个事务2.savepoint 保存点名 -- 设置保存点3.rollback to 保存点名 -- 回退事务4.rollback -- 回退全部事务5.commit -- 提交事务,所有的操作生效,不能回退
细节:- 没有设置保存点
- 多个保存点
- 存储引擎
- 开始事务方式
- 回退事务
当执行回退事务时,通过指定保存点可以回退到指定的点
- 提交事务
当使用了commit语句结束事务之后,其它会话[其他连接] 可以查看到事务变化后的新数据 [所有的数据正式生效]
例子
-- 事务的演示操作-- 1.创建一张测试表CREATE TABLE t27( id INT , `name` VARCHAR(32));SELECT * FROM t27;-- 2.开始事务START TRANSACTION;-- 3.设置保存点SAVEPOINT a;-- 4.执行dml操作1INSERT INTO t27 VALUES(100,'tom');-- 设置保存点bSAVEPOINT b;-- 执行dml操作2INSERT INTO t27 VALUES(200,'jack');-- 回退到bROLLBACK TO b-- 继续回退aROLLBACK TO a-- 如果是rollback,表示直接回退到事务开始的状态ROLLBACKCOMMIT
2.事务注意事项- 如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
- 如果开始一个事务,你没有创建保存点,也可以执行rollback,默认就是回到事务开始的状态
- 可以在事务中(还没有提交时),创建多个保存点 。比如:savepoint aaa;执行dml,savepoint bbb;
- 可以在事务没有提交前,选择回退到哪个保存点
- innodb的存储引擎支持事务,myisam不支持
- 开始一个事务的方式 start transaction或者set autocommit = off;
例子
-- 讨论事务细节-- 1. 如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚INSERT INTO t27 VALUES(300,'milan'); -- 自动提交 commitSELECT * FROM t27;-- 2. 如果开始一个事务,你没有创建保存点,也可以执行rollback,-- 默认就是回到事务开始的状态START TRANSACTIONINSERT INTO t27 VALUES(400,'king');INSERT INTO t27 VALUES(500,'scott');ROLLBACK -- 表示直接回退到事务开始的状态COMMIT-- 3. 可以在事务中(还没有提交时),创建多个保存点 。-- 比如:savepoint aaa;执行dml,savepoint bbb;-- 4. 可以在事务没有提交前,选择回退到哪个保存点-- 5. innodb的存储引擎支持事务,myisam不支持-- 6. 开始一个事务的方式 start transaction或者set autocommit = off;SET autocommit = off
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- MySQL 窗口函数
- 线上服务宕机,码农试用期被毕业,原因竟是给MySQL加个字段
- mac通过docker一键部署MySQL8
- day07-2MySQL索引
- CentOS部署MySQL
- MySQL用户也可以是个角色
- python+request+pymysql+pytest数据驱动
- CentOS 7.9 安装 MySQL 5.7.35
- 关于windows-server-下MySQL Community版本的的安装与配置
- InnoDB关于事务、锁、MVCC专题