mysql 事务原理详解

本文深入探讨了MySQL事务的原理,包括事务的四大特性(ACID)、案例演示、并发事务问题、事务隔离级别及其影响,并重点讲解了Spring框架中的事务管理和事务实现原理,如REDO LOG和UNDO LOG的作用。
摘要由CSDN通过智能技术生成

前言

事务是mysql Innodb引擎的一大特点,可以说,在日常开发中,对于mysql事务的使用无处不在,因此深入了解并掌握mysql的事务原理很有必要。

一、mysql事务简介

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

比如 : 张三给李四转账1000块钱,张三银行账户减少1000元,而李四银行账户的钱要增加1000元。 这一组操作就必须在一个事务的范围内,要么都成功,要么都失败

二、事务四大特性

是事务的四大特性,简称ACID

  1. 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败;
  2. 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态;
  3. 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行;
  4. 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的;

三、事务案例演示

下面来模拟一个事务操作,准备如下一张表,并初始化两条数据,来模拟转账的事务操作;

在这里插入图片描述

1) 测试一个正常的操作

-- 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 = '李四';

执行完成后,可以看到效果是预期的;

在这里插入图片描述

2)测试异常情况

-- 1. 查询张三余额 

select * from account where name = '张三';

-- 2. 张三余额减1000

update account set money = money - 1000 where name = '张三';

1/0

-- 3. 李四余额加1000

update account set money = money + 1000 where name = '李四';

由于这个语句中出现了一个不符合sql语法的错误,执行到1/0的时候报错,导致第三步无法正常执行,最终的结果如下,即张三扣减了1000,但是李四并没有加1000,即数据在操作前后不一致了;
在这里插入图片描述

基于上面产生的异常情况,在实际开发过程中,假如是运行在程序中的,为了避免出现这样的问题,就需要通过事务来进行控制;

通过事务控制

在操作之前,我们需要了解下面两个命令

1、查看当前的事务提交方式

SELECT @@autocommit ;

“1”表示自动提交,即在默认情况下,事务是自动提交的,为了模拟事务的效果,我们需要修改下这个事务的自动提交方式;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值