2.插入测试数据
现在我们有了测试表,表中有12条数据,打开另一个查询对话框在SSMS中(意味着重新创建了一个session)
3.在新的查询窗口中首先要开启事务,然后写一个插入语句
在这个地方,我们能看到开启了一个事务。但是没有end tran 来终止事务,因此事务状态为“open”,现在运行脚本来看一下当前看起的运行处于“open”状态的session。
现在能够看到如上图展示一样,运行的查询正在open状态的session。我们执行了这个命令但是没有完结它,DBA会联系这个session的创建者来完成事务,或者回滚事务。
现在让我们创建另一个session,更新一条记录并且不提交,即让查询session的状态为“open”。因此在新的查询窗口中 写一个语句来执行如下:
这里会看到系统正在运行后没有完成语句的状态(因为上一个事务没有关闭导致表锁,这个不能插入),现在可以在另外的窗口查询一下阻塞的情况,如下检查阻塞的session。
如上所示,阻塞的session ID是58,由于我们更新查询导致阻塞了54的执行,54就是我们插入数据未提交的批处理。
现在我们能搞清楚阻塞的原因,也就可以从容解决阻塞了。
解决
方案1
在了解业务的情况下,可以直接使用kill session ID的语句来终止某个阻塞的session。
方案2
在执行的事务的起始加入“set lock_timeout 1000” 语句,这表示如果阻塞超过1000毫秒,这个请求将被终止。
方案3
回滚或者提交事务。这个就不细说了。
下面是所有语句的代码:
/****Creating dummy table Employee ****/ CREATE TABLE Employee ( Empid int NOT NULL, Name nchar(10) NULL, City nchar(10) NULL ) ON [PRIMARY] GO /**** Insert dummy data in Employee table *****/ Insert into Employee Values(1245,"George","Jax"), (1045,"Peter","Anadale"), (1157,"John","Dallas"), (1175,"Pete","Topeka"), (875,"Petron","Vienna"), (2311,"Kohli","Mumbai"), (1547,"Peter","Kansas"), (3514,"Abian","KHI"), (4251,"Ghani","Alexandria"), (957,"Ahmed","Vienna"), (1084,"Bhanu","Manderin"), (2954,"Ganeshan","Mcclean")/***** Insert query in new session ****/ BEGIN TRAN Insert into Employee Values(1245,"George","Jax") /**** Query to check currently running sessions ****/ SELECT DISTINCT name AS database_name, session_id, host_name, login_time, login_name, reads, writes FROM sys.dm_exec_sessions LEFT OUTER JOIN sys.dm_tran_locks ON sys.dm_exec_sessions.session_id = sys.dm_tran_locks.request_session_id INNER JOIN sys.databases ON sys.dm_tran_locks.resource_database_id = sys.databases.database_id WHERE resource_type <> "DATABASE" --AND name ="specific db name" ORDER BY name/**** update query in new session ****/ update Employee set name = "SHERAZ" where empid = 1245 /**** Query to check blocking queries with session id ****/ SELECT session_id, blocking_session_id, text FROM sys.dm_exec_requests CROSS APPLY sys.dm_exec_sql_text(sql_handle); /*** Command if you want to kill blocking session ****/ kill (54)总结