Ⅰ 查看sqlserver被鎖的表以及如何解鎖
查看被鎖表:select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT' spid 鎖表進程 tableName 被鎖表名 解鎖: declare @spid int Set @spid = 57 --鎖表進程declare @sql varchar(1000)set @sql='kill '+cast(@spid as varchar)exec(@sql)
Ⅱ 怎麼查看sqlserver資料庫是否有死鎖信息
死鎖檢測
use master
Select * from sysprocesses where blocked<>0
--找到SPID
exec sp_lock
--根據SPID找到OBJID
select object_name(85575343)
--根據OBJID找到表名
Ⅲ sqlserver資料庫select操作會造成鎖表嗎
鎖的類別有兩種分法:
從資料庫系統的角度來看鎖分為獨占鎖(即排它鎖),共享鎖和更新鎖
MS-SQL Server 使用以下資源鎖模式。
鎖模式 描述
共享 (S) 用於不更改或不更新數據的操作(只讀操作),如 SELECT 語句。
更新 (U) 用於可更新的資源中。防止當多個會話在讀取、鎖定以及隨後可能進行的資源更新時發生常見形式的死鎖。
排它 (X) 用於數據修改操作,例如 INSERT、UPDATE 或 DELETE。確保不會同時同一資源進行多重更新。
意向鎖 用於建立鎖的層次結構。意向鎖的類型為:意向共享 (IS)、意向排它 (IX) 以及與意向排它共享 (SIX)。
架構鎖 在執行依賴於表架構的操作時使用。架構鎖的類型為:架構修改 (Sch-M) 和架構穩定性 (Sch-S)。
大容量更新 (BU) 向表中大容量復制數據並指定了 TABLOCK 提示時使用。
共享鎖
共享 (S) 鎖允許並發事務讀取 (SELECT) 一個資源。資源上存在共享 (S) 鎖時,任何其它事務都不能修改數據。一旦已經讀取數據,便立即釋放資源上的共享 (S) 鎖,除非將事務隔離級別設置為可重復讀或更高級別,或者在事務生存周期內用鎖定提示保留共享 (S) 鎖。
Ⅳ 怎樣查詢出SQLSERVER被鎖的表,以鎖表的SQL語句
查看被鎖表:
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'
spid 鎖表進程
tableName 被鎖表名
Ⅳ sql server 2000 查看哪些表被鎖
usemaster--必須在master資料庫中創建
go
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[p_lockinfo]')andOBJECTPROPERTY(id,N'IsProcere')=1)
dropprocere[dbo].[p_lockinfo]
GO
/*--處理死鎖
查看當前進程,或死鎖進程,並能自動殺掉死進程
因為是針對死鎖的,所以如果有死鎖進程,只能查看死鎖進程
當然,你可以通過參數控制,不管有沒有死鎖,都只查看死鎖進程
*/
/*--調用示例
execp_lockinfo
--*/
createprocp_lockinfo
@kill_lock_spidbit=0,--是否殺掉死鎖的進程,1殺掉,0僅顯示
@show_spid_if_nolockbit=1--如果沒有死鎖的進程,是否顯示正常進程信息,1顯示,0不顯示
as
setnocounton
declare@countint,@snvarchar(1000),@iint
selectid=identity(int,1,1),標志,
進程ID=spid,線程ID=kpid,塊進程ID=blocked,資料庫ID=dbid,
資料庫名=db_name(dbid),用戶ID=uid,用戶名=loginame,累計CPU時間=cpu,
登陸時間=login_time,打開事務數=open_tran,進程狀態=status,
工作站名=hostname,應用程序名=program_name,工作站進程ID=hostprocess,
域名=nt_domain,網卡地址=net_address
into#tfrom(
select標志='死鎖的進程',
spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,
status,hostname,program_name,hostprocess,nt_domain,net_address,
s1=a.spid,s2=0
frommaster..sysprocessesajoin(
selectblockedfrommaster..sysprocessesgroupbyblocked
)bona.spid=b.blockedwherea.blocked=0
unionall
select'|_犧牲品_>',
spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,
status,hostname,program_name,hostprocess,nt_domain,net_address,
s1=blocked,s2=1
frommaster..sysprocessesawhereblocked<>0
)aorderbys1,s2
select@count=@@rowcount,@i=1
if@count=0and@show_spid_if_nolock=1
begin
insert#t
select標志='正常的進程',
spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time,
open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address
frommaster..sysprocesses
set@count=@@rowcount
end
if@count>0
begin
createtable#t1(idintidentity(1,1),anvarchar(30),bInt,EventInfonvarchar(255))
if@kill_lock_spid=1
begin
declare@spidvarchar(10),@標志varchar(10)
while@i<=@count
begin
select@spid=進程ID,@標志=標志from#twhereid=@i
insert#t1exec('dbccinputbuffer('+@spid+')')
if@@rowcount=0insert#t1(a)values(null)
if@標志='死鎖的進程'exec('kill'+@spid)
set@i=@i+1
end
end
else
while@i<=@count
begin
select@s='dbccinputbuffer('+cast(進程IDasvarchar)+')'from#twhereid=@i
insert#t1exec(@s)
if@@rowcount=0insert#t1(a)values(null)
set@i=@i+1
end
selecta.*,進程的SQL語句=b.EventInfo
from#tajoin#t1bona.id=b.id
orderby進程ID
end
setnocountoff
go
Ⅵ sqlserver 怎麼查看錶的數據是加密的
在SQl2005下自帶的函數hashbytes() ,此函數是微軟在SQL SERVER 2005中提供的,可以用來計算一個字元串的 MD5 和 SHA1 值,使用方法如下:
--獲取123456的MD5加密串
select hashbytes('MD5', '123456') ;
--獲取123456的SHA1加密串
select hashbytes('SHA1', '123456') ;有了這個函數可以在sqlserver中為字元串進行加密,但是hashbytes() 函數的返回結果是 varbinary類型,(以 0x 開頭 16 進制形式的二進制數據)通常情況下,我們需要的都是字元串型的數據,很多人首先想到的可能就是用 CAST 或 Convert 函數將varbinary 轉換為 varchar,但這樣轉換後的結果會是亂碼,正確轉換 varbinary 可變長度二進制型數據到 16 進制字元串應該使用系統內置函數 sys.fn_varbintohexstr()(只在sqlserver2005下有),如下所示:select sys.fn_varbintohexstr(hashbytes('MD5', '123456'))
然後就可以截取需要的部分select lower(right(sys.fn_varbintohexstr(hashbytes('MD5','123456')),32))為md5加密串。
Ⅶ sqlserver鎖表機制
這個問題要具體分析:
第一,事務隔離級別基本兩種模式,一種是阻塞式(read committed,repeatable read,serializable)
,一種是非阻塞式(read uncommitted,snapshot)。
默認是read committed,這種情況一般在更新表的時候,如果不使用hint 提示,基本是先對表添加IX鎖,級別不算高,基本和其他鎖兼容,但是repeatable read,serializable 事務隔離級別就會先對表添加IX鎖,然後向X鎖轉化,而X鎖和大多數鎖都不兼容,容易發生表阻塞。
第二種隔離級別不會有以上問題,但是又引入了其它的問題。
以上是一種情況。
另外一種就是 鎖升級,一個鎖是96B內存,如果太多,sqlserver就會升級為表鎖,一般是5000以上行級鎖就升級為一個表X鎖。
所以適當的文件分組和表分區 是有必要的。
其次就是資源互相引用導致事務長時間不能釋放,導致真正的死鎖,不過SQL2005以後,這種情況發生的概率很低。
留個問題你自己去想。
兩個SQL,兩個連接,同時執行。
update A set A.NAME=xxx where A.id=55
update A set A.NAME=xxx where A.id=56, 如果 56 不存在你說會發生什麼情況呢?
Ⅷ sqlserver怎麼用sql查看具體哪個表被鎖住了
詳細步驟如下:
1、點擊【新建查詢】按鈕,打開SQL命令編輯框,對資料庫表的操作以及維護都可以通過編輯SQL命令實現。
3、創建數據表的源代碼如下:
use test go
if exists(select name from sys.tables where name='Student')
drop table Student go
create table Student
(sname nchar(10) primary key,
sex nchar(2) not null,
bir datetime)
Ⅸ sqlserver鎖表不能查詢嗎
能查詢 但是不能插入修改刪除操作。
--查看被鎖表: select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT'
--spid 鎖表進程
--tableName 被鎖表名
-- 解鎖:
declare @spid int
Set @spid = 57 --鎖表進程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)
Ⅹ sqlserver查看錶是否被鎖
-- 找到臨時表的記錄數select@intCountProperties = Count(*),@intCounter = 1 from #tmp_lock_who IF @@ERROR<0 RETURN @@ERROR if @intCountProperties=0 select '現在沒有阻塞和死鎖信息' as message -- 循環開始 while @intCounter <= @intCountPropertiesbegin -- 取第一條記錄select@spid = spid,@bl =bl from #tmp_lock_who where id = @intCounterbegin if @spid =0select'引起資料庫死鎖的是: '+ CAST(@bl AS VARCHAR(10)) + '進程號,其執行的SQL語法如下'elseselect'進程號SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '進程號SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其當前進程執行的SQL語法如下' DBCC INPUTBUFFER (@bl )end-- 循環指針下移