day08-MySQL事务

MySQL事务

先来看一个例子
有一张balance表:
day08-MySQL事务

文章插图
需求:将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.什么是事务
  • 什么是事务
事务用于保证数据的一致性,它由一组相关的dml语句(update,insert,delete)组成,该组的dml语句要么全部成功,要么全部失败 。如:转账就要用事务来处理,用以保证数据的一致性 。
  • 事务和锁
当执行事务操作时(dml语句),mysql会在表上加锁,防止其他用户修改表的数据 。这对用户来讲是非常重要的 。
  • mysql数据库控制台事务的几个重要操作(基本操作)

day08-MySQL事务

文章插图
注意:当直接回退到保存点a时,会删除中间的保存点b
1.start transaction --开始一个事务2.savepoint 保存点名 -- 设置保存点3.rollback to 保存点名 -- 回退事务4.rollback -- 回退全部事务5.commit -- 提交事务,所有的操作生效,不能回退细节:
  1. 没有设置保存点
  2. 多个保存点
  3. 存储引擎
  4. 开始事务方式
  • 回退事务
在介绍回退事务前,先介绍一下保存点(savepoint) 。保存点是事务中的点,用于取消部分事务,当结束事务时(commit),会自动地删除该事务所定义的所有保存点 。
当执行回退事务时,通过指定保存点可以回退到指定的点
  • 提交事务
使用commit语句可以提交事务 。当执行了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,表示直接回退到事务开始的状态ROLLBACKCOMMIT2.事务注意事项
  1. 如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
  2. 如果开始一个事务,你没有创建保存点,也可以执行rollback,默认就是回到事务开始的状态
  3. 可以在事务中(还没有提交时),创建多个保存点 。比如:savepoint aaa;执行dml,savepoint bbb;
  4. 可以在事务没有提交前,选择回退到哪个保存点
  5. innodb的存储引擎支持事务,myisam不支持
  6. 开始一个事务的方式 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

经验总结扩展阅读