当前位置: 首页 > news >正文

Mysql 事物

对于一些转账问题,如果转账出现了错误,会造成钱财丢失时

有两种方式避免错误

方式一:

使用@@autocommit 方法控制,设置手动提交,如果成功则提交,如果失败则回滚

create table account(id int auto_increment primary key comment '主键ID',name varchar(10) comment '姓名',money int comment '余额'
)comment '账户表';
insert into account(id,name,money)values (null,'张三',2000),(null,'李四',2000);select @@autocommit;#自动提交的意思
set @@autocommit=0;#设置为手动提交select * from account where name='张三';
#--恢复数据
update account set money=2000 where name='张三'or name='李四';#--张三转账
update account set money=money-1000 where name='张三';程序出现报错...#--李四收钱
update account set money=money+1000 where name='李四';commit ;rollback ;

 方式二:使用start transaction 用法和上述相同

#--转账操作
start transaction ;select * from account where name='张三';
#--恢复数据
update account set money=2000 where name='张三'or name='李四';#--张三转账
update account set money=money-1000 where name='张三';程序出现报错...#--李四收钱
update account set money=money+1000 where name='李四';#--提交事务
commit ;#--回滚事物
rollback ;

事务四大特性

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

 

并发事物问题

脏读(Dirty Read)

  • 含义:一个事务读取了另一个事务尚未提交的数据 。若未提交事务回滚,先读取的事务拿到的数据就是无效的。比如事务 A 修改某条记录但未提交,事务 B 此时读取了这条记录,若 A 回滚,B 读到的数据就和实际不一致
  • 原因
    • 事务并发执行,一个事务更新数据未提交时,另一个事务就去读取 。
    • 数据库事务隔离级别设置过低,如设置为Read Uncommitted(读未提交) ,允许事务读取其他事务未提交的数据。
  • 解决方法
    • 设置事务隔离级别:调整为Read Committed(读已提交)、Repeatable Read(可重复读)或Serializable(串行化) ,避免读取未提交数据。
    • 加锁:读取操作时使用行级锁或表级锁锁定数据,防止其他事务修改。
    • 优化事务设计:缩短事务执行时长,减少脏读发生几率 。

 

不可重复读(Non - Repeatable Read)

  • 含义:在同一个事务中,两次读取同一行数据,结果却不一致 。比如事务 A 先读取某行数据,事务 B 在期间更新或删除了该行数据,事务 A 再次读取时结果就不同了。
  • 原因
    • 并发事务更新:一个事务读取数据后,另一个事务对同一行数据进行更新操作 。
    • 并发事务删除:一个事务读取数据后,另一个事务对同一行数据进行删除操作 。
  • 解决方法
    • 设置事务隔离级别:设为Repeatable ReadSerializable ,防止事务执行期间数据被其他事务修改或删除。
    • 加锁:读取操作时使用行级锁或表级锁锁定数据。
    • 优化事务设计:缩短事务持续时间,降低并发操作对数据的影响 。

幻读(Phantom Read)

  • 含义:在同一个事务中,两次执行相同条件的查询,结果集却不一致 。比如事务 A 先按条件查询出一些数据,事务 B 在期间插入或删除了符合条件的数据,事务 A 再次查询时结果集就变了。
  • 原因
    • 并发事务插入或删除:一个事务查询数据后,另一个事务对相同条件的数据进行插入或删除操作 。
    • 并发事务更新:一个事务查询数据后,另一个事务对相同条件的数据进行更新操作,使符合查询条件的数据发生变化 。
  • 解决方法
    • 设置事务隔离级别:设为Serializable ,可避免幻读,但性能开销较大。
    • 使用行级锁或范围锁:查询时锁定数据,防止其他事务插入、更新或删除数据。
    • 优化事务设计:缩短事务持续时间,降低出现幻读的可能性 。

 

http://www.xdnf.cn/news/430867.html

相关文章:

  • React状态管理-对state进行保留和重置
  • FCB文件疑问+求助:01 百度网盘视频自动生成AI笔记pdf会出现对应fcb文件-作用待详解
  • FFmpeg3.4 libavcodec协议框架增加新的decode协议
  • INFINI Console 纳管 Elasticsearch 9(一):指标监控、数据管理、DSL 语句执行
  • 深入理解 C++ 标准模板库(STL):从基础到实践
  • 不用mathtype将word中的公式修改成新罗马字体(加编号)
  • Android设备是否满足硬件要求
  • R-tree详解
  • 快速幂算法详解
  • 【前端】【JavaScript】【总复习】四万字详解JavaScript知识体系
  • 【C++进阶篇】二叉搜索树的实现(赋源码)
  • 国产大模型「五强争霸」,决战AGI!
  • upload-labs通关笔记-第3关 文件上传之黑名单绕过
  • 数据结构(2)线性表-顺序表
  • 二次封装 el-dialog 组件:打造更灵活的对话框解决方案
  • VUE_UI组件的二次封装
  • Redis Cluster 集群搭建和集成使用的详细步骤示例
  • 微信小程序分包策略:优化加载性能与用户体验
  • 使用Kubernetes实现零停机部署
  • android抓包踩坑记录
  • linux系统如何将采集的串口数据存储到txt
  • TCP首部格式及三次握手四次挥手
  • 操作系统导论——第29章 基于锁的并发数据结构
  • 【25软考网工】第六章(5)应用层安全协议
  • 讯联云库项目开发日志(一)
  • 记录算法笔记(2025.5.13)二叉树的最大深度
  • 基于STM32、HAL库的ADAU1701JSTZ-RL音频接口芯片驱动程序设计
  • flink的TaskManager 内存模型
  • 奇怪的公式
  • 代码随想录三十七天 完全背包二维 完全背包一维 518. 零钱兑换 II 377. 组合总和 Ⅳ