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

数据库中锁与ETL的故障排除和性能优化

锁的类型

  • 共享锁(Shared Lock,S锁):又称读锁,允许事务对数据进行读取操作,多个事务可同时获取同一资源的共享锁,不会互相阻塞,用于并发读操作。
  • 排他锁(Exclusive Lock,X锁):也称写锁,只允许一个事务对数据进行写操作,其他事务不能同时获取该资源的排他锁或共享锁,确保写操作的原子性和完整性。
  • 读锁:与共享锁类似,主要用于读取数据时,防止其他事务对数据进行修改,保证读操作的一致性。
  • 写锁:等同于排他锁,用于写操作,防止其他事务同时对数据进行读写操作,避免数据冲突。

乐观锁与悲观锁

  • 乐观锁:假设数据一般不会发生冲突,在更新数据时,先检查数据是否被其他事务修改,通过版本号或时间戳机制实现,适用于并发冲突少的场景。
  • 悲观锁:认为数据在处理过程中易发生冲突,对数据操作前先获取锁,确保在自己处理数据时其他事务无法访问,如使用共享锁、排他锁等实现,适合并发冲突多的场景。

数据库隔离级别

  • 读未提交(Read Uncommitted):最低级别,事务可读取其他事务未提交的数据,会出现脏读。
  • 读已提交(Read Committed):事务只能读取已提交的数据,可避免脏读,但可能出现不可重复读。
  • 可重复读(Repeatable Read):在同一事务内多次读取相同数据结果一致,可避免脏读、不可重复读,但可能有幻读。
  • 串行化(Serializable):最高级别,事务串行执行,可避免所有并发问题,但性能开销大。

联系与区别

  • 联系:共享锁、排他锁等是实现悲观锁的具体方式,而数据库隔离级别通过锁机制等实现,不同隔离级别使用不同的锁策略来控制并发事务的访问。
  • 区别:共享锁、排他锁等关注对数据的具体锁定方式,乐观锁、悲观锁是并发控制的策略,数据库隔离级别则是从事务角度规定事务之间的隔离程度。

在ETL中的应用

  • 故障排除:若ETL过程中出现数据不一致问题,可检查数据库隔离级别是否合适,是否因锁冲突导致数据读取或写入异常,如排他锁未释放造成写操作阻塞。
  • 性能优化:对于读多写少的ETL任务,可使用共享锁提高并发读性能;并发冲突少的场景可考虑乐观锁,减少锁开销;合理设置数据库隔离级别,在保证数据一致性前提下提高性能,如对一致性要求不高的报表查询可使用读已提交级别。

电商订单系统案例

假设一个电商订单系统,有用户下单、库存更新等操作。

共享锁与排他锁应用

  • 用户A和B同时查询某商品库存,数据库对库存数据加共享锁,A、B可同时读取,无冲突,保证了并发读性能。
  • 用户C下单购买该商品,此时数据库对库存数据加排他锁,在C更新库存时,其他用户无法对库存进行读写操作,直至C操作完成释放排他锁,保证了库存数据的一致性。

乐观锁与悲观锁应用

  • 乐观锁:系统默认并发冲突少,库存表有version字段。用户D和E同时下单,先读取库存及version,D先提交更新,将version加1,E提交时发现version变化,得知数据已被修改,可选择重试或放弃,适用于多数用户下单不冲突的场景,减少锁开销。
  • 悲观锁:若商品稀缺,并发冲突可能多,用户F下单时,数据库对库存记录加排他锁,直到F完成库存更新和订单创建才释放,防止其他用户同时操作库存,保证数据准确性,但并发性能略低。

数据库隔离级别应用

  • 读未提交:用户G在订单处理事务中读取库存数据,此时另一用户H未提交的库存修改被G读到,若H回滚,G读取的数据就是无效的,出现脏读,在对数据一致性要求不高的临时统计场景可使用。
  • 读已提交:用户I查询订单列表,事务中只能读取已提交的订单数据,避免了脏读。但事务未结束时,若其他用户修改并提交订单数据,I再次查询结果可能不同,即不可重复读,适用于对数据实时性要求较高的查询场景。
  • 可重复读:用户J在事务中多次查询某订单状态,即使其他用户修改提交,J查询结果不变,避免了不可重复读。但有新订单插入时,J再次查询可能出现新订单,即幻读,常用于订单状态统计等事务。
  • 串行化:在月底订单数据清算等对数据一致性要求极高的场景,使用串行化隔离级别,事务串行执行,虽性能低,但能避免所有并发问题,保证清算结果准确。

在ETL中的故障排除与性能优化应用

  • 故障排除:ETL从订单系统抽取数据到数据仓库时,若出现数据不一致,如库存数量不符,经查发现是在抽取库存数据时,隔离级别为读未提交,导致抽取到未提交数据。将隔离级别调整为读已提交后,解决了该问题。
  • 性能优化:ETL每晚批量更新订单数据到数据仓库,因订单数据量大,并发读多写少。原使用排他锁导致性能低,后对读操作使用共享锁,并发性能大幅提升。同时,对不要求强一致性的历史订单数据查询,将隔离级别从可重复读调整为读已提交,减少了锁开销,提高了查询性能。

http://www.kler.cn/a/473084.html

相关文章:

  • HTML5 动画效果:淡入淡出(Fade In/Out)详解
  • SpringBoot | 使用Apache POI库读取Excel文件介绍
  • 结构化日志和集中日志服务
  • selenium合集
  • QPS和TPS 的区别是什么?QPS 大了会有什么问题,怎么解决?
  • 快速上手:采用Let‘sEncrypt免费SSL证书配置网站Https (示例环境:Centos7.9+Nginx+Let‘sEncrypt)
  • 【微服务】8、分布式事务 ( XA 和 AT )
  • Perl语言的文件操作
  • DeviceNet转Profinet网关如何革新污水处理行业!
  • tomcat12启动流程源码分析
  • adb使用及常用命令
  • JavaEE之定时器及自我实现
  • 闲谭SpringBoot--ShardingSphere分库分表探究
  • spring mvc源码学习笔记之一
  • Java高频面试之SE-10
  • 单片机-外部中断
  • springboot 集成 etcd
  • YCM上告警项怎么修改
  • 【转载记录】Scikit-learn 报错:’super’ object has no attribute ‘__sklearn_tags__’.
  • Perl语言的语法糖
  • 【HTML+CSS+JS+VUE】web前端教程-2-HTML5介绍和基础骨架
  • 【2024华为OD-E卷-100分-boss的收入】(题目+思路+JavaC++Python解析)
  • 【并发篇】CompletableFuture学习
  • JavaScript 正则表达式
  • 代码随想录算法训练营第1天(数组1)| 704. 二分查找、27. 移除元素、977.有序数组的平方
  • 【数据库】SQL相关知识点总结1(数据库约束、三大范式、关系模型、聚合函数)