锁分区提升并发,以及锁等待实例
码字介绍
http://msdn.microsoft.com/en-us/library/ms187504(v=SQL.100).aspx
锁分区技术对提高并发有一定帮助,但对对象操作又有了新的定义,需要DBA&开发人员在设计,维护应用中做更细致的考量.
锁分区提升并发,以及锁等待实例
--测试数据库tempdb --创建测试表 create table testlkp ( id int )--step1 spid 64中执行事务insert BEGIN TRAN ttt INSERT INTO testlkp VALUES(1)
说明:创建测试环境,第一步开启事务执行insert 成功
---随意不相关session spid70中查看操作的数据库上下文中查看锁的情况select request_session_id,* from sys.dm_tran_locks where resource_database_id=DB_ID()order by request_mode
说明:观察锁情况发现锁中分区号15有对象级IX锁
--step 2新开启session spid 67 执行sql 被阻塞ALTER TABLE testlkp ALTER COLUMN id smallint
说明:由于无法获得整体对象SCH-M锁,等待
---随意不相关session spid70中查看操作的数据库上下文中查看锁的情况select request_session_id,* from sys.dm_tran_locks where resource_database_id=DB_ID()order by request_mode
说明:其他锁分区(0-14)均获得了SCH-M锁,但由于15由于IX锁无法获得
--Step3 新开启session 执行事务 插入数据 spid 71 被阻塞BEGIN TRAN ttt INSERT INTO testlkp VALUES(2) ---------blocked
说明:开启新session查询被阻塞
---随意不相关session spid70中查看操作的数据库上下文中查看锁的情况select request_session_id,* from sys.dm_tran_locks where resource_database_id=DB_ID()order by request_mode
说明:insert需要申请表的IX锁,但正好落在15这个分区上,所以等待
--Step4 新开启session 执行事务 插入数据 spid 65 执行成功!BEGIN TRAN ttt INSERT INTO testlkp VALUES(3)
说明:开启新的session insert 插入成功!
---随意不相关session spid70中查看操作的数据库上下文中查看锁的情况select request_session_id,* from sys.dm_tran_locks where resource_database_id=DB_ID()order by request_mode
说明:新的session插入操作时在其他的锁分区上(16)获得IX锁所以执行成功!
思考:锁分区技术的出现提高了并发,但在做表级操作如果需所有分区锁如SCH-M将有可能对此类操作造成更"长"等待
如索引维护操作(需SCH-M锁),一旦有长时间事务甚至孤立事务占据着分区级的某个锁,则可能一直陷入等待状态造成阻塞从而影响全局.
在诸如此类操作或应用设计中,大家需要全面仔细考量.
转载于:https://www.cnblogs.com/shanksgao/p/3140149.html
锁分区提升并发,以及锁等待实例相关推荐
- 19.Atomic系列之LongAdder的底层原理(分段锁提升并发性能)
老王:小陈啊,上一章我们讲解了cas的缺陷,无法同时更新多个变量.以及ABA的问题.以及如果使用AtomicReference解决同时更新多个变量,如果使用AtomicStampedReference ...
- 【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!
来自:冰河技术 写在前面 最近,很多小伙伴留言说,在学习高并发编程时,不太明白分布式锁是用来解决什么问题的,还有不少小伙伴甚至连分布式锁是什么都不太明白.明明在生产环境上使用了自己开发的分布式锁,为什 ...
- 【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁(升级版)!!
点击上方蓝色"Garnett的Java之路",关注并选择"设为星标" 持之以恒,贵在坚持,每天进步一点点! 写在前面 最近,很多小伙伴留言说,在学习高并发编程时 ...
- Python之路 34:并发与并行、锁(GIL、同步锁、死锁与递归锁)、信号量、线程队列、生消模型、进程(基础使用、进程通信、进程池、回调函数)、协程
内容: 同步锁 死锁.递归锁 信号量和同步对象(暂时了解即可) 队列------生产者和消费者模型 进程(基础使用.进程通信.进程池.回调函数) 协程 一.并发并行与同步异步的概念 1.1.并发和并行 ...
- java 锁升级_Java并发 锁优化和锁升级
前言 本篇文章介绍Java Synchronized锁优化. 锁是存在哪里的,怎么标识是什么锁 Monitor机制在Java中怎么表现的 锁优化 锁升级 1. 锁存在哪里 对象在内存中的布局分为三块区 ...
- 高并发线程/锁/内存处理模型
文章目录 锁与线程 一.进程/线程的基本介绍 进程 线程 1 线程的调度与时间片 2 优先级 3 生命周期 进程与线程的区别 二.线程的使用 2.1 Thread类的介绍 2.2 创建线程的方法 Th ...
- 《八股文》细数Java线程、并发、锁,温故而知新
<八股文>细数Java线程.并发.锁,温故而知新 基础 1. 并行.并发有什么区别? 2. 说说什么是进程和线程? 3. 说说线程有几种创建方式? 4. 为什么调用start()方法时会执 ...
- java线程钥匙_Java多线程并发编程/锁的理解
一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...
- java投票锁_Java并发编程锁之独占公平锁与非公平锁比较
Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...
最新文章
- 64位环境启用ASP.net 2.0的32位扩展
- Go语言中的struct的初始化。
- 基于weka实现的神经网络算法实现
- 计算机网络(网络层,运输层和应用层的一些tips)
- maven shade
- cvAdd()和 cvAddS()函数的使用
- 使用 C# 运行符号测试
- linux内核的I2C子系统详解5——i2c_driver的注册、i2c_client的来源
- nginx文件服务器密码登录,风的方向
- 【JavaScript算法】---快速排序法
- php下拉框选中效果,jquery模拟select下拉框效果
- tensorflow精进之路(二十四)——Object Detection API目标检测(中)(COCO数据集训练的模型—ssd_mobilenet_v1_coco模型)
- Android 打开蓝牙流程
- 【转】当你伤心时一定要读的50句话
- 引号快捷键_Android Studio 实用快捷键
- excel数据库_从案例说excel如何实现数据库管理
- OpenCV python下载和安装
- Web前端案例_QQ登录界面实现
- 中国近代史导图(二)
- Scikit-learn_聚类算法_K均值聚类
热门文章
- Redis的两种持久化机制RDB和AOF
- AngularJS集合数据遍历显示
- latex使用subequations后,段后首行文字不对齐
- declare sql语句_每天10分钟学习T-SQL语言基础(Part 5)
- Zigbee协议栈中OSAL的运行机理
- RRT,RRT*,A*,Dijkstra,PRM算法
- 关于printf()与自增自减运算符结和问题
- css常用样式汇总记录
- 一文带你了解java面向对象的三大特性:继承、封装、多态
- 启明云端分享|ESP32-S3开发环境搭建,这里我们会介绍两个比较常用的开发环境搭建:WINDOWS\LINUX