1.事务基本介绍
事务不是一个实实在在存在的个体,是一个抽象的概念
(1)概念
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败
这里面包含多个步骤,如果这多个步骤没有被事务管理的话,执行的到第二步出现了异常了,下面的操作不会再执行了,这时候造成的影响是,张三账号减少了500,但是李四的账号并没有加上500
如果这多个步骤被事务管理了后,这三个操作就变成了一个整体,这样,在第二步出现了异常,就进行回滚。
等到三个步骤都执行完了,就提交事务。
将一组SQL放在一个批次中去执行
InnoDB支持事务
(2)操作
开启事务:start transaction;
回滚:rollback;
提交:commit;
(3)MySQL数据库中事务默认自动提交
一条DML(增删改)语句会自动提交一次事务。
- 事务提交的两种方式:
自动提交:mysql就是自动提交的。一条DML(增删改)语句会自动提交一次事务(如果不开启事务的话,就是自动提交;开启事务START TRANSACTION,就要COMMIT)。
手动提交:需要先开启事务,再提交
但是ORACLE数据库是默认手动提交的。
- 修改事务的默认提交方式:select @@autocommit ; -- 1 代表自动提交 0 -- 代表手动提交
- 查看事务的默认提交方式:set @@autocommit=0 ;
当修改成手动提交后,如果不提交(COMMIT),就不会持久化。
例子:
当我把修改成手动提交,如果没有COMMIT; 上面的UPDATE执行后,表中的记录不会改变即默认的自动回滚)。只有执行了COMMIT; 这句话,表中的记录才会发生改变。
自动提交,一条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; -- 恢复默认值