當前位置:首頁 » 編程語言 » sql2000表被鎖

sql2000表被鎖

發布時間: 2023-06-06 09:02:33

1. sql Server資料庫表鎖定原理以及如何解除表的鎖定

1. 資料庫表鎖定原理 1.1 目前的C/S,B/S結構都是多用戶訪問資料庫,每個時間點會有成千上萬個user來訪問DB,其中也會同時存取同一份數據,會造成數據的不一致性或者讀臟數據. 1.2 事務的ACID原則 1.3 鎖是關系資料庫很重要的一部分, 資料庫必須有鎖的機制來確保數據的完整和一致性. 1.3.1 SQL Server中可以鎖定的資源: 1.3.2 鎖的粒度: 1.3.3 鎖的升級: 鎖的升級門限以及鎖升級是由系統自動來確定的,不需要用戶設置. 1.3.4 鎖的類型: (1) 共享鎖: 共享鎖用於所有的只讀數據操作. (2) 修改鎖: 修改鎖在修改操作的初始化階段用來鎖定可能要被修改的資源,這樣可以避免使用共享鎖造成的死鎖現象 (3) 獨占鎖: 獨占鎖是為修改數據而保留的。它所鎖定的資源,其他事務不能讀取也不能修改。獨占鎖不能和其他鎖兼容。 (4) 架構鎖 結構鎖分為結構修改鎖(Sch-M)和結構穩定鎖(Sch-S)。執行表定義語言操作時,SQL Server採用Sch-M鎖,編譯查詢時,SQL Server採用Sch-S鎖。 (5) 意向鎖 意向鎖說明SQL Server有在資源的低層獲得共享鎖或獨占鎖的意向。 (6) 批量修改鎖 批量復制數據時使用批量修改鎖 1.3.4 SQL Server鎖類型 (1) HOLDLOCK: 在該表上保持共享鎖,直到整個事務結束,而不是在語句執行完立即釋放所添加的鎖。 (2) NOLOCK:不添加共享鎖和排它鎖,當這個選項生效後,可能讀到未提交讀的數據或「臟數據」,這個選項僅僅應用於SELECT語句。 (3) PAGLOCK:指定添加頁鎖(否則通常可能添加表鎖)。 (4) READCOMMITTED用與運行在提交讀隔離級別的事務相同的鎖語義執行掃描。默認情況下,SQL Server 2000 在此隔離級別上操作。 (5) READPAST: 跳過已經加鎖的數據行,這個選項將使事務讀取數據時跳過那些已經被其他事務鎖定的數據行,而不是阻塞直到其他事務釋放鎖, READPAST僅僅應用於READ COMMITTED隔離性級別下事務操作中的SELECT語句操作。 (6) READUNCOMMITTED:等同於NOLOCK。 (7) REPEATABLEREAD:設置事務為可重復讀隔離性級別。 (8) ROWLOCK:使用行級鎖,而不使用粒度更粗的頁級鎖和表級鎖。 (9) SERIALIZABLE:用與運行在可串列讀隔離級別的事務相同的鎖語義執行掃描。等同於 HOLDLOCK。 (10) TABLOCK:指定使用表級鎖,而不是使用行級或頁面級的鎖,SQL Server在該語句執行完後釋放這個鎖,而如果同時指定了HOLDLOCK,該鎖一直保持到這個事務結束。 (11) TABLOCKX:指定在表上使用排它鎖,這個鎖可以阻止其他事務讀或更新這個表的數據,直到這個語句或整個事務結束。 (12) UPDLOCK :指定在讀表中數據時設置更新 鎖(update lock)而不是設置共享鎖,該鎖一直保持到這個語句或整個事務結束,使用UPDLOCK的作用是允許用戶先讀取數據(而且不阻塞其他用戶讀數據),並且保證在後來再更新數據時,這一段時間內這些數據沒有被其他用戶修改。 2. 如何解除表的鎖定,解鎖就是要終止鎖定的那個鏈接,或者等待該鏈接事務釋放. 2.1 Activity Monitor 可以通過Wait Type, Blocked By欄位查看到,SPID 54 被SPID 53 阻塞. 可以右鍵Details查到詳細的SQL 語句,或Kill掉這個進程. 2.2 SQL Server提供幾個DMV,查看locks sys.dm_exec_requests sys.dm_tran_locks sys.dm_os_waiting_tasks sys.dm_tran_database_transactions (1) select * from sys.dm_tran_locks where resource_type<>'DATABASE' --and resource_database_id=DB_ID()

2. 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

3. sql server 表鎖死後怎麼解開

你好:

鎖類型較多,下面介紹下:
HOLDLOCK 將共享鎖保留到事務完成,而不是在相應的表、行或數據頁不再需要時就立即釋放鎖。HOLDLOCK 等同於 SERIALIZABLE。
NOLOCK 不要發出共享鎖,並且不要提供排它鎖。當此選項生效時,可能會讀取未提交的事務或一組在讀取中間回滾的頁面。有可能發生臟讀。僅應用於 SELECT 語句。
PAGLOCK 在通常使用單個表鎖的地方採用頁鎖。
READCOMMITTED 用與運行在提交讀隔離級別的事務相同的鎖語義執行掃描。默認情況下,SQL Server 2000 在此隔離級別上操作。
READPAST 跳過鎖定行。此選項導致事務跳過由其它事務鎖定的行(這些行平常會顯示在結果集內),而不是阻塞該事務,使其等待其它事務釋放在這些行上的鎖。 READPAST 鎖提示僅適用於運行在提交讀隔離級別的事務,並且只在行級鎖之後讀取。僅適用於 SELECT 語句。
READUNCOMMITTED 等同於 NOLOCK。
REPEATABLEREAD 用與運行在可重復讀隔離級別的事務相同的鎖語義執行掃描。
ROWLOCK 使用行級鎖,而不使用粒度更粗的頁級鎖和表級鎖。
SERIALIZABLE 用與運行在可串列讀隔離級別的事務相同的鎖語義執行掃描。等同於 HOLDLOCK。
TABLOCK 使用表鎖代替粒度更細的行級鎖或頁級鎖。在語句結束前,SQL Server 一直持有該鎖。但是,如果同時指定 HOLDLOCK,那麼在事務結束之前,鎖將被一直持有。
TABLOCKX 使用表的排它鎖。該鎖可以防止其它事務讀取或更新表,並在語句或事務結束前一直持有。
UPDLOCK 讀取表時使用更新鎖,而不使用共享鎖,並將鎖一直保留到語句或事務的結束。UPDLOCK 的優點是允許您讀取數據(不阻塞其它事務)並在以後更新數據,同時確保自從上次讀取數據後數據沒有被更改。
XLOCK 使用排它鎖並一直保持到由語句處理的所有數據上的事務結束時。可以使用 PAGLOCK 或 TABLOCK 指定該鎖,這種情況下排它鎖適用於適當級別的粒度。

希望能幫助你!

4. sql表被鎖了怎麼辦

你可以嘗試重啟SQL服務或重啟資料庫,這樣可以恢復正常。接下來查看日誌,排查被鎖的原因,最後根據情況,處理問題。

熱點內容
易語言管理系統源碼 發布:2025-07-15 13:11:49 瀏覽:946
伺服器老是自己關機重啟什麼原因 發布:2025-07-15 13:11:48 瀏覽:439
能耗資料庫 發布:2025-07-15 12:50:55 瀏覽:329
謎宮腳本 發布:2025-07-15 12:40:07 瀏覽:865
安卓手機語音操作在哪裡開啟 發布:2025-07-15 12:18:49 瀏覽:284
安卓導航儀上網卡插哪裡 發布:2025-07-15 12:01:58 瀏覽:455
把文件編譯成數據 發布:2025-07-15 11:53:16 瀏覽:543
mt4如何修改密碼 發布:2025-07-15 11:53:16 瀏覽:216
2021思域新款買哪個配置 發布:2025-07-15 11:33:24 瀏覽:772
路由搭建http伺服器 發布:2025-07-15 11:26:45 瀏覽:724