SQL事务阻塞分析
类型:电子教程大小:8.5M语言:中文评分:8.3标签:立即下载-阻塞/*********************************************************************************************************************** 阻塞:其中一个事务阻塞,其它事务等待对方释放它们的锁,同时会导致死锁问题。 - 生成测试表钽如果不是对象id('Ta ')为空则删除表钽转到创建表Ta(ID int主键,Col1 int,Col2 nvarchar(10))插入钽选择1,101,“A”联合全部选择2,102,“乙”联合全部选择3,103,“C”转到生成数据: /* 表ta ID Col1 Col2 - 1 101 A 2 102 B 3 103 C(3行受影响) */将处理阻塞减到最少: 1、事务要尽量短2、不要在事务中请求用户输入3、在读数据考虑便用行版本管理4、在事务中尽量访问最少量的数据5、尽可能地使用低的事务隔离级别去阻塞1(事务): - 测试单表-连接窗口1(更新\插入\删除) -开始传输-更新更新谢谢集列2='BB ',其中ID=2 -或插入开始交易插入钽值(4,104,' D') -或删除开始交易删除ta,其中标识=1 -回滚交易-连接窗口2 -开始交易从ta -回滚交易中选择*分析-选择请求_会话_id作为spid,资源类型,db_name(资源_数据库_id)作为数据库名,资源描述,资源关联实体标识,请求模式作为模式,请求状态为状态来自系统。DM _ tran _ lock/* spid资源_ type dbName资源_ description资源_ associated _ entity _ id模式状态-55 DATABASE Test 0S GRANT NULL 54 DATABASE Test 0S GRANT NULL 53 DATABASE Test 0S GRANT NULL 55 PAGE Test 1:201 7205759404040483840 IS GRANT 54 PAGE Test 13:201 72057594040404040483840 IX请求了排它锁)55 KEY Test(020068 E8 b274)72057594040483840s WAIT-(spid :55共享锁等待状态) (9 行受影响) */- 查连接住信息(spid:54、55)从sys.dm_exec_connections中选择连接时间、最后一次读取、最后一次写入、最后一次SQL句柄,其中会话id在(54,55) -查看会话信息从sys.dm_exec_sessions中选择登录时间、主机名、程序名、登录名、最后请求开始时间、最后请求结束时间,其中会话id在(54,55) -查看阻塞正在执行的请求从sys.dm_exec_requests中选择会话标识、阻塞会话标识、等待类型、等待时间、等待资源,其中blocking_session_id0 -正在阻塞请求的会话的身份证。如果此列是空值,则不会阻塞请求-查看正在执行的结构化查询语言语句从sys.dm_exec_connections中选择会话id、sql.text、a . most _ last _ SQL _ handle交叉应用系统。数据管理执行文本作为SQL -也可用函数fn_get_sql通过最近_ sql _句柄得到执行语句其中会话标识在(54,55) /*会话id文本- 54开始交易更新谢谢设置col2='BB '其中ID=2 55开始交易从ta *中选择*处理方法: - 连接窗口2用(诺洛克)从谢谢中开始交易选择*用nolock:业务数据不断变化中,如销售查看当月时可用。
块2(索引):-连接窗口1设置事务隔离级别可序列化-事务隔离级别开始事务更新ta为会话设置列2=' bb。其中col1=102-回滚事务-连接窗口2插入ta (id,col1,col2)值(5,105,E’)处理方法:在ta (col1)上创建索引IX _ ta _ COl1在col 1列上创建索引。更新时,条件:COl1=102将使用范围锁blocking 3(会话设置)获取索引IX_ta_Col1 :上的排他密钥-连接窗口1开始事务-更新更新Ta设置col2=' bb '其中id=2从Ta中选择col2其中id=2-回滚事务-连接窗口2设置事务隔离级别read committed - From ta处理方法:-连接窗口2(充分利用会话设置:业务数据不断变化, 设置事务隔离级别读取未提交-设置会话未提交读取:指定语句可以读取已被其他事务修改但尚未提交的行。