1.事务基本介绍

事务不是一个实实在在存在的个体,是一个抽象的概念

(1)概念

如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败

 事务_持久化

 这里面包含多个步骤,如果这多个步骤没有被事务管理的话,执行的到第二步出现了异常了,下面的操作不会再执行了,这时候造成的影响是,张三账号减少了500,但是李四的账号并没有加上500

事务_增删改_02

 如果这多个步骤被事务管理了后,这三个操作就变成了一个整体,这样,在第二步出现了异常,就进行回滚。

事务_事务管理_03

 等到三个步骤都执行完了,就提交事务。

将一组SQL放在一个批次中去执行
InnoDB支持事务

(2)操作

开启事务:start transaction;

回滚:rollback;

提交:commit;

(3)MySQL数据库中事务默认自动提交

一条DML(增删改)语句会自动提交一次事务。

  • 事务提交的两种方式:

  自动提交:mysql就是自动提交的。一条DML(增删改)语句会自动提交一次事务(如果不开启事务的话,就是自动提交;开启事务START TRANSACTION,就要COMMIT)。

  手动提交:需要先开启事务,再提交

但是ORACLE数据库是默认手动提交的。

  • 修改事务的默认提交方式:select @@autocommit ; -- 1 代表自动提交 0 -- 代表手动提交
  • 查看事务的默认提交方式:set @@autocommit=0 ;

当修改成手动提交后,如果不提交(COMMIT),就不会持久化。

例子:

事务_增删改_04

 当我把修改成手动提交,如果没有COMMIT; 上面的UPDATE执行后,表中的记录不会改变即默认的自动回滚)。只有执行了COMMIT; 这句话,表中的记录才会发生改变。

 事务_mysql_05

自动提交,一条DML语句就是自动提交

UPDATE account1 SET balance = 1000;

	-- mysql是默认开启事务自动提交的
	SET autocommit = 0 /* 关闭 */
	SET autocommit = 1 /* 开启(默认的) */
	-- 手动处理事务
	SET autocommit = 0 -- 关闭自动提交
	-- 事务开启
	START TRANSACTION -- 标记一个事务的开始,从这个之后的sql都在同一个事务内
	 
	insert xxx
	insert xxx
	-- 提交: 持久化
	COMMIT
	-- 回滚:回到原来的样子
	ROLLBACK
	-- 事务结束
	SET autocommit = 1 -- 事务结束,开启自动提交
	 
	-- 了解
	SAVEPOINT 保存点名称 -- 设置一个事务的保存点
	ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到某个保存点
	RELEASE SAVEPOINT 保存点名称 -- 撤销保存点

  模拟场景,转账

CREATE TABLE account1 (
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(10),
    balance DOUBLE
);

-- 添加数据
INSERT INTO account1 (NAME, balance) values ('zhangsan', 1000), ('lisi', 1000);
-- zhangsan给lisi转账500
-- 0.开启事务
set autocommit =0; -- 关闭自动提交
START TRANSACTION;
-- 1.zhangsan账号 - 500
UPDATE account1 set balance = balance - 500 where NAME='zhangsan';
-- 2.lisi账号 + 500
UPDATE account1 set balance = balance + 500 where NAME='lisi';
-- 3.提交事务,就被持久化了
commit;
ROLLBACK; -- 回滚
set autocommit = 1;  -- 恢复默认值