查看被鎖表:
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、網(wǎng)站設(shè)計(jì)、江寧網(wǎng)絡(luò)推廣、微信平臺(tái)小程序開發(fā)、江寧網(wǎng)絡(luò)營銷、江寧企業(yè)策劃、江寧品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供江寧建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:jinyejixie.com
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'
spid 鎖表進(jìn)程
tableName 被鎖表名
減少程序中 DML(insert,update,delete) 操作所花費(fèi)的時(shí)間,對(duì)此類操作做好隔離控制,防止阻塞。如果事務(wù)產(chǎn)生異常,確保事務(wù)可以正?;貪L。
通常情況下,數(shù)據(jù)庫鎖表大多是因?yàn)槌绦蛟O(shè)計(jì)不合理導(dǎo)致的,在寫代碼的時(shí)候,我們要對(duì)業(yè)務(wù)場景充分考慮,盡量做到以下兩點(diǎn):減少程序中 DML(insert,update,delete) 操作所花費(fèi)的時(shí)間,對(duì)此類操作做好隔離控制,防止阻塞。如果事務(wù)產(chǎn)生異常,確保事務(wù)可以正常回滾。
在數(shù)據(jù)庫開發(fā)過程中,不得不考慮并發(fā)性的問題,因?yàn)楹苡锌赡墚?dāng)別人正在更新表中記錄時(shí),你又從該表中讀數(shù)據(jù),那你讀出來的數(shù)據(jù)有可能就不是你希望得到的數(shù)據(jù)??梢哉f有些數(shù)據(jù)同時(shí)只能有一個(gè)事物去更新,否則最終顯示給用戶的數(shù)據(jù)不是數(shù)據(jù)庫中現(xiàn)存的數(shù)據(jù)。鎖表就限制不同的事物在同一時(shí)間內(nèi)不允許同時(shí)操作一張表,實(shí)例很簡單,可以用select來鎖定整張表,那別人就不可能更新或是讀取表的記錄。
詳細(xì)步驟如下:
1、點(diǎn)擊【新建查詢】按鈕,打開SQL命令編輯框,對(duì)數(shù)據(jù)庫表的操作以及維護(hù)都可以通過編輯SQL命令實(shí)現(xiàn)。
2、在編輯框內(nèi)編輯創(chuàng)建數(shù)據(jù)庫表的代碼,確認(rèn)代碼無誤后,單擊【執(zhí)行】按鈕,創(chuàng)建數(shù)據(jù)表。
3、創(chuàng)建數(shù)據(jù)表的源代碼如下:
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)
數(shù)據(jù)庫管理系統(tǒng),database management system,簡稱dbms,是一種操縱和管理數(shù)據(jù)庫的大型軟件,用于建立、使用和維護(hù)數(shù)據(jù)庫。用戶通過dbms訪問數(shù)據(jù)庫中的數(shù)據(jù),數(shù)據(jù)庫管理員也通過dbms進(jìn)行數(shù)據(jù)庫的維護(hù)工作。它可使多個(gè)應(yīng)用程序和用戶用不同的方法在同時(shí)或不同時(shí)刻去建立,修改和詢問數(shù)據(jù)庫。
提供數(shù)據(jù)定義語言(ddl)。用它書寫的數(shù)據(jù)庫模式被翻譯為內(nèi)部表示。數(shù)據(jù)庫的邏輯結(jié)構(gòu)、完整性約束和物理儲(chǔ),存結(jié)構(gòu)保存在內(nèi)部的數(shù)據(jù)字典中。數(shù)據(jù)庫的各種數(shù)據(jù)操作(如查找、修改、插入和刪除等)和數(shù)據(jù)庫的維護(hù)管理都是以數(shù)據(jù)庫模式為依據(jù)的。
查看被鎖表:
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'
--spid 鎖表進(jìn)程
--tableName 被鎖表名
解鎖:
declare @spid int
Set @spid = 57 --鎖表進(jìn)程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)
--查詢出死鎖的SPID
select blocked
from (select * from sysprocesses where blocked0 ) a
where not exists(select * from (select * from sysprocesses where blocked0 ) b
where a.blocked=spid)
--輸出引起死鎖的操作
DBCC INPUTBUFFER (@spid)
--查詢當(dāng)前進(jìn)程數(shù)
select count(-1) from sysprocesses
where dbid in (select dbid from sysdatabases where name like '%telcount%');
1. 數(shù)據(jù)庫表鎖定原理
1.1 目前的C/S,B/S結(jié)構(gòu)都是多用戶訪問數(shù)據(jù)庫,每個(gè)時(shí)間點(diǎn)會(huì)有成千上萬個(gè)user來訪問DB,其中也會(huì)同時(shí)存取同一份數(shù)據(jù),會(huì)造成數(shù)據(jù)的不一致性或者讀臟數(shù)據(jù).
1.2 事務(wù)的ACID原則
1.3 鎖是關(guān)系數(shù)據(jù)庫很重要的一部分, 數(shù)據(jù)庫必須有鎖的機(jī)制來確保數(shù)據(jù)的完整和一致性.
1.3.1?SQL Server中可以鎖定的資源:
1.3.2?鎖的粒度:
1.3.3?鎖的升級(jí):
鎖的升級(jí)門限以及鎖升級(jí)是由系統(tǒng)自動(dòng)來確定的,不需要用戶設(shè)置.
1.3.4?鎖的類型:
(1) 共享鎖:
共享鎖用于所有的只讀數(shù)據(jù)操作.
(2) 修改鎖:
修改鎖在修改操作的初始化階段用來鎖定可能要被修改的資源,這樣可以避免使用共享鎖造成的死鎖現(xiàn)象
(3) 獨(dú)占鎖:
獨(dú)占鎖是為修改數(shù)據(jù)而保留的。它所鎖定的資源,其他事務(wù)不能讀取也不能修改。獨(dú)占鎖不能和其他鎖兼容。
(4) 架構(gòu)鎖
結(jié)構(gòu)鎖分為結(jié)構(gòu)修改鎖(Sch-M)和結(jié)構(gòu)穩(wěn)定鎖(Sch-S)。執(zhí)行表定義語言操作時(shí),SQL Server采用Sch-M鎖,編譯查詢時(shí),SQL Server采用Sch-S鎖。
(5) 意向鎖
意向鎖說明SQL Server有在資源的低層獲得共享鎖或獨(dú)占鎖的意向。
(6) 批量修改鎖
批量復(fù)制數(shù)據(jù)時(shí)使用批量修改鎖
1.3.4 SQL Server鎖類型
(1) HOLDLOCK: 在該表上保持共享鎖,直到整個(gè)事務(wù)結(jié)束,而不是在語句執(zhí)行完立即釋放所添加的鎖。
(2)?NOLOCK:不添加共享鎖和排它鎖,當(dāng)這個(gè)選項(xiàng)生效后,可能讀到未提交讀的數(shù)據(jù)或“臟數(shù)據(jù)”,這個(gè)選項(xiàng)僅僅應(yīng)用于SELECT語句。
(3) PAGLOCK:指定添加頁鎖(否則通??赡芴砑颖礞i)。
(4) READCOMMITTED用與運(yùn)行在提交讀隔離級(jí)別的事務(wù)相同的鎖語義執(zhí)行掃描。默認(rèn)情況下,SQL Server 2000 在此隔離級(jí)別上操作。
(5) READPAST: 跳過已經(jīng)加鎖的數(shù)據(jù)行,這個(gè)選項(xiàng)將使事務(wù)讀取數(shù)據(jù)時(shí)跳過那些已經(jīng)被其他事務(wù)鎖定的數(shù)據(jù)行,而不是阻塞直到其他事務(wù)釋放鎖,
READPAST僅僅應(yīng)用于READ COMMITTED隔離性級(jí)別下事務(wù)操作中的SELECT語句操作?!?/p>
(6) READUNCOMMITTED:等同于NOLOCK?!?/p>
(7) REPEATABLEREAD:設(shè)置事務(wù)為可重復(fù)讀隔離性級(jí)別?!?/p>
(8) ROWLOCK:使用行級(jí)鎖,而不使用粒度更粗的頁級(jí)鎖和表級(jí)鎖。
(9) SERIALIZABLE:用與運(yùn)行在可串行讀隔離級(jí)別的事務(wù)相同的鎖語義執(zhí)行掃描。等同于 HOLDLOCK?!?/p>
(10) TABLOCK:指定使用表級(jí)鎖,而不是使用行級(jí)或頁面級(jí)的鎖,SQL Server在該語句執(zhí)行完后釋放這個(gè)鎖,而如果同時(shí)指定了HOLDLOCK,該鎖一直保持到這個(gè)事務(wù)結(jié)束。 (11) TABLOCKX:指定在表上使用排它鎖,這個(gè)鎖可以阻止其他事務(wù)讀或更新這個(gè)表的數(shù)據(jù),直到這個(gè)語句或整個(gè)事務(wù)結(jié)束。
(12) UPDLOCK :指定在
讀表中數(shù)據(jù)時(shí)設(shè)置更新 鎖(update lock)而不是設(shè)置共享鎖,該鎖一直保持到這個(gè)語句或整個(gè)事務(wù)結(jié)束,使用UPDLOCK的作用是允許用戶先讀取數(shù)據(jù)(而且不阻塞其他用戶讀數(shù)據(jù)),并且保證在后來再更新數(shù)據(jù)時(shí),這一段時(shí)間內(nèi)這些數(shù)據(jù)沒有被其他用戶修改。
2. 如何解除表的鎖定,解鎖就是要終止鎖定的那個(gè)鏈接,或者等待該鏈接事務(wù)釋放.
2.1 Activity Monitor
可以通過Wait Type, Blocked By欄位查看到,SPID 54 被SPID 53 阻塞. 可以右鍵Details查到詳細(xì)的SQL 語句,或Kill掉這個(gè)進(jìn)程.
2.2 SQL Server提供幾個(gè)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)
SELECT?session_id,?blocking_session_id,*
FROM?sys.dm_exec_requests
WHERE?blocking_session_id??0
(3)代碼
SELECT
request_session_id?as?Spid,
Coalesce(s.name?+?'.'?+?o.name?+?isnull('.'?+?i.name,''),
s2.name?+?'.'?+?o2.name,
db.name)?AS?Object,
l.resource_type?as?Type,
request_mode?as?Mode,
request_status?as?Status
FROM?sys.dm_tran_locks?l
LEFT?JOIN?sys.partitions?p
ON?l.resource_associated_entity_id?=?p.hobt_id
LEFT?JOIN?sys.indexes?i
ON?p.object_id?=?i.object_id
AND?p.index_id?=?i.index_id
LEFT?JOIN?sys.objects?o
ON?p.object_id?=?o.object_id
LEFT?JOIN?sys.schemas?s
ON?o.schema_id?=?s.schema_id
LEFT?JOIN?sys.objects?o2
ON?l.resource_associated_entity_id?=?o2.object_id
LEFT?JOIN?sys.schemas?s2
ON?o2.schema_id?=?s2.schema_id
LEFT?JOIN?sys.databases?db
ON?l.resource_database_id?=?db.database_id
WHERE?resource_database_id?=?DB_ID()
ORDER?BY?Spid,?Object,?CASE?l.resource_type
When?'database'?Then?1
when?'object'?then?2
when?'page'?then?3
when?'key'?then?4
Else?5?end
這個(gè)問題要具體分析:
第一,事務(wù)隔離級(jí)別基本兩種模式,一種是阻塞式(read committed,repeatable read,serializable)
,一種是非阻塞式(read uncommitted,snapshot)。
默認(rèn)是read committed,這種情況一般在更新表的時(shí)候,如果不使用hint 提示,基本是先對(duì)表添加IX鎖,級(jí)別不算高,基本和其他鎖兼容,但是repeatable read,serializable 事務(wù)隔離級(jí)別就會(huì)先對(duì)表添加IX鎖,然后向X鎖轉(zhuǎn)化,而X鎖和大多數(shù)鎖都不兼容,容易發(fā)生表阻塞。
第二種隔離級(jí)別不會(huì)有以上問題,但是又引入了其它的問題。
以上是一種情況。
另外一種就是 鎖升級(jí),一個(gè)鎖是96B內(nèi)存,如果太多,sqlserver就會(huì)升級(jí)為表鎖,一般是5000以上行級(jí)鎖就升級(jí)為一個(gè)表X鎖。
所以適當(dāng)?shù)奈募纸M和表分區(qū) 是有必要的。
其次就是資源互相引用導(dǎo)致事務(wù)長時(shí)間不能釋放,導(dǎo)致真正的死鎖,不過SQL2005以后,這種情況發(fā)生的概率很低。
留個(gè)問題你自己去想。
兩個(gè)SQL,兩個(gè)連接,同時(shí)執(zhí)行。
update A set A.NAME=xxx where A.id=55
update A set A.NAME=xxx where A.id=56, 如果 56 不存在你說會(huì)發(fā)生什么情況呢?
網(wǎng)頁題目:鎖表sqlserver,oracle鎖表
URL網(wǎng)址:http://jinyejixie.com/article28/hojecp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、面包屑導(dǎo)航、App開發(fā)、企業(yè)網(wǎng)站制作、定制網(wǎng)站、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)