什么是事务
事务:是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
当有一些需求需要很多个命令的时候,当中途遇到错误,后面的命令无法继续执行,但是前面命令的数据已经修改了,只是不能接受的,事务的作用就是当遇到这种情况时,恢复之前那些成功地命令所执行的数据
我们只需要在业务逻辑执行之前开启事务,执行完毕后提交事务。
如果执行过程中报错,则回滚事务,把数据恢复到事务开始之前的状态。
事务的操作
转账事例举例
进行转账的操作:初始状态张三有2000,李四有2000,张三给李四转账1000
正常情况
-- 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 = '李四';
结果
异常情况
-- 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 = '李四';
结果:
这样的错误是不允许出现的
控制事务一(手动提交的方法)
语法
- 查看/设置事务提交方式(0:手动提交,1:自动提交)
SELECT @@autocommit ;
SET @@autocommit = 0 ;
- 提交事务(如果所要执行地一些列命令没有报错,就执行提交事务,完成数据的更新)
commit ;
- 回滚事务(如果所要执行地一些列命令有报错,就回滚事务)
rollback;
注意:上述的这种方式,我们是修改了事务的自动提交行为, 把默认的自动提交修改为了手动提交, 此时我们执行的DML语句都不会提交, 需要手动的执行commit进行提交。
举例
select @@autocommit;
set @@autocommit = 0; -- 设置为手动提交
-- 转账操作 (张三给李四转账1000)
-- 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 = '李四';
- 查看没有报错的情况下,若果没有报错,执行提交事务
-- 提交事务
commit;
- 提交完事务,就会更新数据了
select @@autocommit;
set @@autocommit = 0; -- 设置为手动提交
-- 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 = '李四';
- 我们会看到第三条语句出错,这时不要提交事务,而是进行回滚数据
-- 回滚事务
rollback ;
- 这时就不会出现数据的变更,
控制事务二(开启事务的方式)
举例
- 开启事务
start transaction ;
或者
begin ;
- 提交事务
commit ;
- 回滚事务
rollback;
举例
-- 开启事务
start transaction
-- 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 = '李四';
-- 执行完上述指令后
-- 如果正常执行完毕, 则提交事务
commit;
-- 如果执行过程中报错,不要提交事务而是回滚事务
rollback;
事务四大特性
- 原子性:事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性:事务完成时,必须使所有的数据都保持一致状态。
- 隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
上述就是事务的四大特性,简称ACID。
并发事务问题
事务的隔离级别
MySQL的默认隔离级别:Repeatable Read
Oracle的默认隔离级别:Read committed
- 查看事务隔离级别
select @@transaction_isolation;
2). 设置事务隔离级别
set [session\global] transaction isolation level [四种隔离级别] ;
注意:事务隔离级别越高,数据越安全,但是性能越低。