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

数据库事务

数据库事务

  • 事务的ACID
  • 事务的隔离级别
  • MVCC(多版本并发控制)
  • 事务优化

事务的ACID

  1. 原子性(Atomicity):当前事务的操作要么同时成功,要么同时失败。原子性由undolog日志来实现。
  2. 一致性(Consistent):使用事务的最终目的,由其它3个特性以及业务代码正确逻辑来实现。
  3. 隔离性(Isolation):在事务并发执行时,他们内部的操作不能互相干扰。隔离性由MySQL的各种锁以及MVCC机制来实现。
  4. 持久性(Durable):一旦提交了事务,它对数据库的改变就应该是永久性的。持久性由redolog日志来实现。

事务的隔离级别

Mysql的默认隔离级别是可重复读;Oracle的默认隔离级别是读已提交

隔离级别脏读不可重复读幻读
读未提交YYY
读已提交NYY
可重复读NNY
串行化NNN

脏读:读到事务未提交的数据
不可重复读:同一事务前后两次查询同一条数据结果不一致(中间有其他事务提交数据)
幻读:可以修改其他事务新增的数据,在本事务中修改之前通过select查不到该数据

  1. 读锁(共享锁,S锁):一般的select语句不会加锁,如果想加锁使用select…lock in share mode。读锁是共享的,多个事务可以同时读取同一资源,但是不允许其他事务修改。
    隔离级别为串行化时,读操作底层会自动加上读锁,其他隔离级别的读操作不会自动加读锁。
  2. 写锁(排他锁,X锁):insert,delete,update,select…for update 都会加写锁。写锁是排他的,会阻塞其他的写锁和读锁。

MVCC(多版本并发控制)

  1. 3个字段:rowid,trx_id(事务id),roll_pointer(回滚指针)
  2. 如果有主键,rowid用不着
  3. trx_id: 修改当前数据的事务id
  4. roll_pointer:指向当前数据的上一个版本,第一个版本指向回滚语句

事务优化

  1. 将查询等数据准备操作放到事务外
  2. 事务中避免远程调用,远程调用要设置超时,防止事务等待时间太久
  3. 事务中避免一次性处理太多数据,可以拆分成多个事务分次处理
  4. 更新等涉及加锁的操作尽可能放在事务靠后的位置
  5. 能异步处理的尽量异步处理
  6. 应用侧(业务代码)保证数据一致性,非事务执行–应用性能要求很高,且业务相对简单,不然容易出bug

相关文章:

  • Android Fresco 框架缓存模块源码深度剖析(二)
  • 解决 Android Studio “waiting for all target devices to come online“ 卡住问题
  • Asp.net Core API 本地化
  • ACWing:178. 第K短路 (A*算法)
  • 关于SR的一些基本认识
  • 华为OD机试 - 计算观看演唱会场次(Java 2023 B卷 200分)
  • SpringData Redis:RedisTemplate配置与数据操作
  • Linux中Tomcat、idea和MySQL的安装
  • 基于大模型的声带息肉预测及诊疗方案优化研究报告
  • Qt5.15.2实现Qt for WebAssembly与示例
  • WebAssembly 技术在逆向爬虫中的应用研究
  • Git 实战指南:本地客户端连接 Gitee 全流程
  • 算法基础 -- ARM 体系架构设计专家的算法提升目标
  • OpenCV计算摄影学(21)非真实感渲染之边缘保留滤波器edgePreservingFilter()
  • YOLOv11融合[CVPR2025]ARConv中的自适应矩阵卷积
  • 支持向量机SVM的MATLAB分类预测实现
  • 洛谷 P1115 最大子段和(前缀和详解)c++
  • mysql gtid 创建主从大量冲突解决办法
  • 单台openEuler24.03 LTS下的开源大数据环境搭建
  • ubuntu 24.04(linux)安装 jetbrains IntelliJ IDEA,设置图标
  • 新片|《我仍在此》定档5月,《新·驯龙高手》同步北美上映
  • 体重管理门诊来了,瘦不下来的我们有救了?|健康有方FM
  • 企业取消“大小周”引热议,半月谈:不能将显性加班变为隐性加班
  • 一周人物|卡鲁等入围英国特纳奖,李学明新展中国美术馆
  • 我国成功发射卫星互联网低轨卫星
  • 太好玩了!坐进大卫·霍克尼的敞篷车进入他画笔下的四季