后端开发眼中的数据库——数据库事务

本文深入解析事务管理核心概念,涵盖事务的ACID特性——原子性、一致性、隔离性和持久性,探讨事务创建与隔离级别的作用及意义。通过实例说明脏读、幻读与不可重复读等问题,阐述不同隔离级别对解决这些问题的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  一个或一组SQL语句组成一个执行单元,要求同时成功或同时失败。部分存储引擎(InnoDB)可以支持事务功能。

事务的特点(也就是事务的ACID属性):
  • 原子性,就是不可分割。
  • 一致性,就是符合逻辑,比如转账前后双方总金额不变;提现之后,余额要减少。
  • 隔离性,就是互不干扰,一个事务内部的操作及数据对并发的其他事务是隔离的,可用隔离级别微调。当然,没有并发就谈不上隔离。
  • 持久性,就是不能后悔,无论是其他操作还是数据库故障,都不能影响已经提交的事务(无法篡改历史)。
事务的创建

  原始的增删改查单条语句本身就是一个事务,叫隐性事务,数据库会自动创建。显式事务就需要自行添加事务相关的指令了。
  开发过程中,框架会根据代码的逻辑自动的生成带事务指令的SQL语句,比如设置自动提交的参数,自动添加开启事务、回滚事务和提交事务的指令等。
  开启事务的指令中必须存在“SET AUTOCOMMIT = 0;”,“START TRANSACTION;”则可有可无。

事务隔离性

隔离性引发的问题

  • 脏读:读了临时的数据。B事务修改了但没提交,最后回滚了的数据,A事务读取了无效的数据
  • 幻读:读了多出的数据。B事务插入了数据,A事务过程中读了两次发现多了些数据
  • 不可重复读:读了不同的数据。B事务修改了数据,A事务过程中读了两次发现数据不一样了

对应问题,数据库有4种事务隔离级别

  • 读未提交:不设限制,随意读取。
  • 读已提交:只允许事务读取别的事务已经提交的数据,避免脏读。
  • 可重复读:某事务读取过程中不许其他事务修改(插入并不算修改数据),可避免脏读和不可重复读。
  • 串行读取:某事物读取某表时,不许其他事务动这张表,效率极低。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值