sqlserver鎖定表
A. 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)
B. 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 不存在你說會發生什麼情況呢?
C. 如何在SQL Server中鎖定某行記錄
SELECT au_lname FROM authors WITH (ROWLOCK )
鎖定提示 描述
HOLDLOCK 將共享鎖保留到事務完成,而不是在相應的表、行或數據頁不再需要時就立即釋放鎖。HOLDLOCK等同於SERIALIZABLE。
NOLOCK 不要發出共享鎖,並且不要提供排它鎖。當此選項生效時,可能會讀取未提交的事務或一組在讀取中間回滾的頁面。有可能發生臟讀。僅應用於 SELECT語句。
PAGLOCK 在通常使用單個表鎖的地方採用頁鎖。
READCOMMITTED 用與運行在提交讀隔離級別的事務相同的鎖語義執行掃描。默認情況下,SQLServer 2000 在此隔離級別上操作。
READPAST 跳過鎖定行。此選項導致事務跳過由其它事務鎖定的行(這些行平常會顯示在結果集內),而不是阻塞該事務,使其等待其它事務釋放在這些行上的鎖。READPAST 鎖提示僅適用於運行在提交讀隔離級別的事務,並且只在行級鎖之後讀取。僅適用於SELECT 語句。
READUNCOMMITTED 等同於NOLOCK。
REPEATABLEREAD 用與運行在可重復讀隔離級別的事務相同的鎖語義執行掃描。
ROWLOCK 使用行級鎖,而不使用粒度更粗的頁級鎖和表級鎖。
SERIALIZABLE 用與運行在可串列讀隔離級別的事務相同的鎖語義執行掃描。等同於HOLDLOCK。
TABLOCK 使用表鎖代替粒度更細的行級鎖或頁級鎖。在語句結束前,SQLServer 一直持有該鎖。但是,如果同時指定 HOLDLOCK,那麼在事務結束之前,鎖將被一直持有。
TABLOCKX 使用表的排它鎖。該鎖可以防止其它事務讀取或更新表,並在語句或事務結束前一直持有。
UPDLOCK 讀取表時使用更新鎖,而不使用共享鎖,並將鎖一直保留到語句或事務的結束。UPDLOCK 的優點是允許您讀取數據(不阻塞其它事務)並在以後更新數據,同時確保自從上次讀取數據後數據沒有被更改。
XLOCK 使用排它鎖並一直保持到由語句處理的所有數據上的事務結束時。可以使用 PAGLOCK或 TABLOCK 指定該鎖,這種情況下排它鎖適用於適當級別的粒度
D. 怎樣查詢出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 被鎖表名
E. spring 事務 sqlserver 鎖表問題
方案一:
可以將查詢的代碼單出去,新建立一個方法包含它們,在原來的service方法中調用它就好,然後在配置事務時,注意別把這個方法加上事務內。
方案二:
將sqlserver的事務級別下降一個級別,別造成鎖表。sqlserver支持鎖行的。
F. 求助,sqlserver什麼情況下會鎖表
鎖的類別有兩種分法:
從資料庫系統的角度來看鎖分為獨占鎖(即排它鎖),共享鎖和更新鎖
MS-SQL Server 使用以下資源鎖模式。
鎖模式 描述
共享 (S) 用於不更改或不更新數據的操作(只讀操作),如 SELECT 語句。
更新 (U) 用於可更新的資源中。防止當多個會話在讀取、鎖定以及隨後可能進行的資源更新時發生常見形式的死鎖。
G. sqlserver跳過鎖表等待
減少程序中 DML(insert,update,delete) 操作所花費的時間,對此類操作做好隔離控制,防止阻塞。如果事務產生異常,確保事務可以正常回滾。
通常情況下,資料庫鎖表大多是因為程序設計不合理導致的,在寫代碼的時候,我們要對業務場景充分考慮,盡量做到以下兩點:減少程序中 DML(insert,update,delete) 操作所花費的時間,對此類操作做好隔離控制,防止阻塞。如果事務產生異常,確保事務可以正常回滾。
在資料庫開發過程中,不得不考慮並發性的問題,因為很有可能當別人正在更新表中記錄時,你又從該表中讀數據,那你讀出來的數據有可能就不是你希望得到的數據。可以說有些數據同時只能有一個事物去更新,否則最終顯示給用戶的數據不是資料庫中現存的數據。鎖表就限制不同的事物在同一時間內不允許同時操作一張表,實例很簡單,可以用select來鎖定整張表,那別人就不可能更新或是讀取表的記錄。
H. 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)
I. 如何掌握SQLServer的鎖機制
SQL SERVER里的鎖機制:
NOLOCK(不加鎖)
此選項被選中時,SQL Server 在讀取或修改數據時不加任何鎖。 在這種情況下,用戶有可能讀取到未完成事務(Uncommited Transaction)或回滾(Roll Back)中的數據, 即所謂的「臟數據」。
HOLDLOCK(保持鎖)
此選項被選中時,SQL Server 會將此共享鎖保持至整個事務結束,而不會在途中釋放。 例如,「 SELECT * FROM my_table HOLDLOCK」就要求在整個查詢過程中,保持對表的鎖定,直到查詢完成才釋放鎖定。
UPDLOCK(修改鎖)
此選項被選中時,SQL Server 在讀取數據時使用修改鎖來代替共享鎖,並將此鎖保持至整個事務或命令結束。使用此選項能夠保證多個進程能同時讀取數據但只有該進程能修改數據。
TABLOCK(表鎖)
此選項被選中時,SQL Server 將在整個表上置共享鎖直至該命令結束。 這個選項保證其他進程只能讀取而不能修改數據。
PAGLOCK(頁鎖)
此選項為默認選項, 當被選中時,SQL Server 使用共享頁鎖。
TABLOCKX(排它表鎖)
此選項被選中時,SQL Server 將在整個表上置排它鎖直至該命令或事務結束。這將防止其他進程讀取或修改表中的數據。
J. sqlserver表被鎖了怎麼解決
查出鎖表中的SPID
然後輸入:kill SPID