事务——MySQL

事务是数据库操作的基本单位,确保数据的一致性和完整性。本文详细介绍了事务的概念,通过转账案例展示了正常和异常情况下事务的操作流程。并讲解了手动和开启事务两种控制方式,以及事务的四大特性:原子性、一致性、隔离性和持久性。此外,还讨论了并发事务可能引发的问题和事务隔离级别的设置与影响。
摘要由CSDN通过智能技术生成

什么是事务

事务:是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败

当有一些需求需要很多个命令的时候,当中途遇到错误,后面的命令无法继续执行,但是前面命令的数据已经修改了,只是不能接受的,事务的作用就是当遇到这种情况时,恢复之前那些成功地命令所执行的数据

在这里插入图片描述
我们只需要在业务逻辑执行之前开启事务,执行完毕后提交事务
如果执行过程中报错,则回滚事务把数据恢复到事务开始之前的状态


事务的操作

转账事例举例

进行转账的操作:初始状态张三有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 = '李四';

结果:
在这里插入图片描述
这样的错误是不允许出现的

控制事务一(手动提交的方法)

语法

  1. 查看/设置事务提交方式(0:手动提交,1:自动提交)
SELECT @@autocommit ;
SET @@autocommit = 0 ;
  1. 提交事务(如果所要执行地一些列命令没有报错,就执行提交事务,完成数据的更新)
commit ;
  1. 回滚事务(如果所要执行地一些列命令有报错,就回滚事务
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 ;
  • 这时就不会出现数据的变更,

控制事务二(开启事务的方式)

举例

  1. 开启事务
start transaction ;
或者
begin ;
  1. 提交事务
commit ;
  1. 回滚事务
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

  1. 查看事务隔离级别
select @@transaction_isolation;

2). 设置事务隔离级别

set [session\global] transaction isolation level [四种隔离级别] ;

注意:事务隔离级别越高,数据越安全,但是性能越低

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值