热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

数据库技术:事务锁

引发思考今天,发现开发项目中的单号重复了。这是多用户并发操作相同数据导致的结果。有点抽象,理解如下:实际就是多个事务交叉执行(增、删、查、改)了相同数据。导致一个事务不具有完整性了

引发思考

今天,发现开发项目中的单号重复了。

事务锁

这是多用户并发操作相同数据导致的结果。有点抽象,理解如下:实际就是多个事务交叉执行(增、删、查、改)了相同数据。导致一个事务不具有完整性了,数据库的数据也不一致了(这里‘’一致‘’可以理解为:我希望的数据,跟我想像的不一样,比如明明我刚update某表性别为男,我update完它还是女的,如果别人要修改,也得等我update完再改呀!咦,统计男生的总人数的确是加1了,见鬼了)。

事务锁

并发操作数据的不利影响

多个用户试图修改其他用户正在使用的资源时总是会产生负面影响。(这里用户可以理解成事务,用户这个词组总是在不同场合出现,例如redis客户端用户,b/s模式客户端用户,这些情况其实可以广泛理解为请求)

更新丢失:a事务里更新某些数据,a还没结束运行。这段时间,b插足一脚,也更新了那些数据,覆盖了a刚更新完的,a白更了。一段时间后,a正常结束了,a丢失了更新的数据。

脏读:b正在修改某些数据,还没结束运行。这段时间a去读那些数据,但读的不是b修改之后的,而是b修改之前的。一段时间后,b正常结束了,a读的数据还是旧数据。

不可重复读:9点钟,a在读某部分数据。9点半,b修改了那部分数据,b结束运行了。10点钟,a又回头读那部分数据,发现数据和9点钟的不一样。a读的是同一部分,却返回不一样的数据。

 幻读:9点钟a根据条件取了一个结果集看看,还没结束运行。9点半,b删除了那个结果集部分行数据,又新增了部分行数据。10点,a根据相同条件取结果集,发现新增了部分,删除了部分,刚刚是在做梦吧?

总而言之,一旦小三插足干坏事,我就完了。

事务锁

针对上面的问题,可以使用事务锁解决。(事务锁是一种悲观的解决方案

每个事务里可能涉及行数据、页数据、表数据、,这数据相等事务依赖的资源,当请求操作这些资源,可以请求不同类型的锁。 该锁可以阻止其他事务以错误方式操作该资源。 当事务不再依赖锁定的资源时,它将释放锁

简单说,这些数据可以被上锁、上锁后,其他事务对该数据的操做就有限制了,不是你想改就能改,你想读就读。我锁是大爷,我允许,你就能操作;我若不许,你就滚出去!

 

锁粒度: sql server具有多种粒度锁定,例如行粒度、表粒度、数据库粒度……

如果在较小的粒度(例如行)加锁,可以提高并发度,因为对其他事务限制范围小,只是开销较高,锁定了多少行,则需要多少锁。

比如a事务拿到了某行数据的某锁,该限制了其他事务对该行数据的操作,但是其他事务不一定要操作该行,也是就1两个事务需要操作改行,

如果在较大的粒度(例如表)加锁,则会降低并发度,因为锁定整个表限制了其他事务对表中任意部分的访问但开销较低,因为需要维护的锁较少。

 

锁类型:共享锁、排他锁等。锁与锁之间是可以冲突的。比如a事务拿到了某行数据的共享锁,说明a事务结束之前,该行数据都不能被其他事务修改(增、删、改)但是其他事务可以读改行数据。其他事务永远都不能拿到该行数据的排他锁,排他锁的作用是独自占据数据的增、删、改操作。

 

这篇文章不过抛转引玉罢了,官方的就很齐全了

 

需要了解更多数据库技术:事务锁,都可以关注数据库技术分享栏目—编程笔记


推荐阅读
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文详细介绍了Python编程语言的学习路径,涵盖基础语法、常用组件、开发工具、数据库管理、Web服务开发、大数据分析、人工智能、爬虫开发及办公自动化等多个方向。通过系统化的学习计划,帮助初学者快速掌握Python的核心技能。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 随着Redis功能的不断增强和稳定性提升,其应用范围日益广泛,成为软件开发人员不可或缺的技能之一。本文将深入探讨Redis集群的部署与优化,包括主从备份机制、哨兵模式以及集群功能,帮助读者全面理解并掌握Redis集群的应用。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
author-avatar
无声胜有剩
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有