解決sybase數據庫的死鎖問題

在使用數據庫操作時,由于多人同時使用,導致數據庫某些表無法訪問,原因可能是由于多個用戶操作同一個表,爭搶統一資源出現死鎖現象,現將解決死鎖的方法總結如下:

1、執行 ?sp_who 語句,觀察執行結果是查詢出來的表,查看結果中的【state】列中存在lock...的項,證明數據庫中有死鎖,此時查看【blk_spid】必然不是0,應該會是某個id例如2257

2、其實此時就可以通過 kill 2257 語句來干掉,就可以使用數據庫了;

3、不過我們也可以通過?SELECT * FROM master..sysprocesses WHERE status LIKE '%lock%' ?語句來查到有哪些死鎖,然后查看這些信息的blocked列,可以看到這些死鎖是由于哪個死鎖引起的,殺掉即可

4、sp_lock ?可以查看到一些信息,幫助理解

?

?

下面是我從網上其他地方找到詳細的解釋:

?

死鎖的發生對系統的性能和吞吐量都有重要影響,經檢測發現,管理信息系統的死鎖主要是因為兩個或多個線程(登錄)搶占同一表數據資源。引起長時間搶占同一資源不是因為我們需要處理的事務太復雜,時間太長,而往往是因為我們在前端應用程序對數據庫作操作時忘了提交.本文介紹一種處理解決這種死鎖的方法。?
Sybase封鎖原理?
數據共享與數據一致性是一對不可調和的矛盾,為了達到數據共享與數據一致,必須進行并發控制。并發控制的任務就是為了避免共享沖突而引起的數據不一致。Sybase SQL Server并發控制的方法是加鎖機制(LOCKING)。
鎖的類型 可申請的鎖? 已有的鎖 S U X?
S??????? ∨????∨????×?
U?????? ∨?? ?×????×?
X?????? ×??? ×????×

Sybase SQL Server有三種封鎖類型:排它鎖(exclusive lock,簡稱X鎖);共享鎖(share lock,簡稱S鎖);更新鎖(update lock,簡稱U鎖)。這三種鎖的相容矩陣表如下:?
×:表示不兼容。∨:表示兼容。Sybase SQL Server是自動決定加鎖類型的。一般來說,讀(SELECT)操作使用S鎖,寫(UPDATE,INSERT和delete)操作使用X鎖。U鎖是建立在頁級上的,它在一個更新操作開始時獲得,當要修改這些頁時,U鎖會升級為X鎖。?
鎖的力度

SQL Server有兩級鎖:頁鎖和表鎖。通常頁鎖比表鎖的限制更少(或更小)。頁鎖對本頁的所有行進行鎖定,而表鎖則鎖定整個表。為了減小用戶間的數據爭用和改進并發性,SQL Server試圖盡可能地使用頁鎖。

當SQL Server決定一個語句將訪問整個表或表的大多數頁時,它用表鎖來提供更有效的鎖定。鎖定策略直接受查詢方案約束,如果update或delete語句沒有可用的索引,它就執行表掃描或請求一個表鎖定。如果update或delete語句使用了索引,它就通過請求頁鎖來開始,如果影響到大多數行,它就要請求表鎖。一旦一個語句積累的頁鎖超過鎖提升閾值,SQL Server就設法給該對象分配一個表鎖。如果成功了,頁鎖就不再必要了,因此被釋放。表鎖也在頁層提供避免鎖沖突的方法。對于有些命令SQL Server自動使用表鎖。?
鎖的狀態

SQL SERVER加鎖有三種狀態:?
1)意向鎖(intend)—是一種表級鎖,它表示在一個數據頁上獲得一個S或X鎖的意向。意向鎖可以防止其他事務在該數據頁的表上獲得排它鎖。

2)阻塞(blocking,簡記blk)—它表明目前加鎖進程的狀態,帶有blk后綴的鎖說明該進程目前正阻塞另一個需要獲得鎖的進程,只有這一進程完成,其他進程才可以進行。

3)需求鎖(demand)—表示此時該進程企圖得到一個排它鎖。它可以防止在這一表或頁上加過多的S鎖,她表示某一事務是下一個去鎖定該表和該頁的事務。

需求鎖是一個內部過程,因此用sp_lock是無法看見的。?
死鎖DEADLOCK

簡單地說,有兩個用戶進程,每個進程都在一個單獨的頁或表上有一個鎖,而且每個進程都想在對方進程的頁或表上請求不相容鎖時就會發生“死鎖”。在這種情況下,第一個進程在等待另一進程釋放鎖,但另一進程要等到第一個進程的對象釋放時才會釋放自己的鎖。

SQL Server檢查是否死鎖,并終止事務中CPU時間積累最小的用戶(即最后進入的用戶)。SQL Server回滾該用戶的事務,并用消息號1205通知有此死鎖行為的應用程序,然后允許其他用戶進程繼續進行。

在多用戶情形下,每個用戶的應用程序都應檢查每個修改數據的事務是否有1205號消息,以此確定是否有可能死鎖。消息號1025表示該用戶的事務因死鎖而終止并被回滾。應用程序必須重新開始這個事務處理。?
查找死鎖原因?
既然管理信息系統長時間死鎖的原因是由于我們提交或者是提交不當,那么我們就可以通過修改程序防止出現死鎖。定位死鎖出錯處主要經過以下三步:?
1)在死鎖出現時,用SP_WHO,SP_LOCK獲得進程與鎖的活動情況。?
2)結合庫表sysobjects和相應的操作員信息表查出被鎖的庫表與鎖住別人的操作員。?
3)根據鎖定的庫表與操作員的崗位,可以估計出程序大約出錯處。詢問操作員在死鎖時執行的具體操作即可完全定位出錯處。最后查找程序并修改之。?
用sp_who獲取關于被阻礙進程的信息

系統過程sp_who給出系統進程的報告。如果用戶的命令正被另一進程保持的鎖阻礙,則:?
◆status列顯示“lock sleep”。?
◆blk列顯示保持該鎖或這些鎖的進程標識,即被誰鎖定了。?
◆loginame列顯示登錄操作員。結合相應的操作員信息表,便可知道操作員是誰。?
Fid spid status loginame origname blk dbname cmd?
0 1 lock sleep lm lm 18 QJYD SELECT?
0 2 sleeping NULL NULL 0 master NETWORK HANDLER?
0 3 sleeping NULL NULL 0 master NETWORK HANDLER?
……?
用sp_lock瀏覽鎖

要得到關于當前SQL Server上保持的鎖的報告,可用系統過程sp_lock [spid1[,spid2]],spid1,spid2是表master.dbo.sysprocesses中的sql server進程id號,用sp_who可以得到鎖定與被鎖定的spid號:?
◆locktype列顯示加鎖的類型和封鎖的粒度,有些鎖的后綴還帶有blk表明鎖的狀態。前綴表明鎖的類型:Sh—共享鎖,Ex—排它鎖或更新鎖,中間表明鎖死在表上(”table”或’intent’)還是在頁上(page). 后綴“blk”表明該進程正在障礙另一個需要請求鎖的進程。一旦正在障礙的進程一結束,其他進程就向前移動。“demand”后綴表明當前共享鎖一釋放, 該進程就申請互斥鎖。?
◆table_id列顯示表的id號,結合sysobjects即可查出被封鎖的表名。?
執行該進程后屏幕顯示?
Fid Spid locktype table_id page row dbname Class context?
0 1 Sh_intent 678293476 0 0 QJYD Non Cursor LockFam dur?
0 1 Sh_page 678293476 31764 0 QJYD Non Cursor Lock?
0 18 Ex_intent 9767092 0 0 QJYD Non Cursor LockFam dur?
……?
定位出錯處

根據sp_who與sp_lock命令的結果,結合sysobjects和相應的操作員信息表。得到操作員及其在死鎖時所操作的庫表,便大約可以知道應用程序的出錯處,再詢問操作員在死鎖時執行什么操作以進一步認證。最后查找程序并修正之。

?

轉載于:https://www.cnblogs.com/latter/p/5961230.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256195.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256195.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256195.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

揭開.NET 2.0配置之謎(一)

2010-03-20 15:33 by 吳秦, 4828 閱讀, 20 評論, 收藏, 編輯 此文是譯文,原文是Jon Rista,Unraveling the Mysteries of .NET 2.0 Configuration,由于這篇文章比較長,所以我就分為幾部分來翻譯。 以前沒有翻譯過外文,看…

Pytorch基礎(六)——激活函數

一、概念 激活函數顧名思義,就是一種可以給神經網絡注入靈魂的一種方法,也可以稱之為激活層。其計算就是將線性的函數轉變為非線性函數的過程,只有這樣,我們制作的深層神經網絡才能無限逼近真實值。 自神經網絡發展到目前為止&am…

android數據的五種存儲方式

Android提供了5種方式存儲數據1 使用SharedPreferences存儲數據它的本質是基于XML文件存儲key-value鍵值對數據&#xff0c;通常用來存儲一些簡單的配置信息。其存儲位置在/data/data/< >/shared_prefs目錄下。SharedPreferences對象本身只能獲取數據而不支持存儲和修改&…

【NOIP 模擬題】[T1] 等差數列(dp)

【題解】【dp】 【f[i][j]表示以i為結尾&#xff0c;j為公差的子序列個數】 【要注意有負數&#xff0c;所以將公差1000】 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int const p9901; int f[1010][2010],n,a[1010]; lo…

走在網頁游戲開發的路上(十)

頁游資源管理 現在頁游的規模越來越來大&#xff0c;游戲內容豐富&#xff0c;資源管理變得很重要。現在一款SNS頁游的所有資源可達50M&#xff0c;MMO頁游更高達幾百M&#xff0c;不可能把資源放到一個文件里面、也不可能一次性加載完所有資源。按200kb/s的下載速度來算&#…

Pytorch基礎(七)——線性層(全連接層)

一、概念 在神經網絡中&#xff0c;我們通常用線性層來完成兩層神經元間的線性變換。 按照官網的解釋&#xff0c;Linear.weight也即A&#xff0c; 我們可以稱之為權重矩陣&#xff0c;對其轉置后乘以輸入數據(一般都是一維張量)&#xff0c;加上Linear.bias即b偏置。 二、P…

跨線程取出控件的值的寫法(不是跨線程賦予控件值)

//這個方法是跨線程取出控件的值&#xff0c;不是跨線程賦予控件值private delegate void DelegateGetControl(各種參數);private void GetControl(各種參數&#xff0c;和委托的參數是一樣的){try{if (this.InvokeRequired){//如果是跨線程的控件&#xff0c;就調用委托去實現…

使系統生成50個0-9之間的隨機數,將每個數字出現的次數 存入一個一維數組中,統計出現次數最多和出現次數最少的數字,及出現次數 和出現頻率。...

int [] numsnew int[10]; for(int i0;i<50;i){ int num(int)(Math.random()*10);//隨機生成0-9 nums[num];//生成隨機數 對應下標位置 自增 } int maxIndex0;//存儲出現最多次數的下標 int minIndex0;//存儲出現最少次數的下標 //循環數組 for(int i1;i<nums.length;i){ …

PureMVC(AS3)剖析:吐槽

PureMVC&#xff08;AS3&#xff09;剖析&#xff1a;吐槽 寫在前面 世上沒有銀彈——不存在適用于所有情況的框架&#xff0c;只有適合的框架。再者任何一個好的東西&#xff08;語言、框架等&#xff09;最終還取決于用的人&#xff0c;語言和框架本身并不能保證用戶的代碼清…

Pytorch基礎(八)——正則化

一、概念 正則化在深度學習領域是為了防止訓練結果過擬合而采取的一種方法。 1.1 過擬合 過擬合表示模型的泛化能力較差&#xff0c;體現在實際訓練模型上就是在訓練集表現很好&#xff0c;但是在測試集的效果一般。 過擬合的原因&#xff1a;1&#xff0c;模型過于復雜。2&…

uva 11997 K Smallest Sums 優先隊列處理多路歸并問題

題意&#xff1a;K個數組每組K個值&#xff0c;每次從一組中選一個&#xff0c;共K^k種&#xff0c;問前K個小的。 思路&#xff1a;優先隊列處理多路歸并&#xff0c;每個狀態含有K個元素。詳見劉汝佳算法指南。 1 #include<iostream>2 #include<cstdio>3 #includ…

.net生成隨機字符串

生成隨機字符串的工具類&#xff1a; /// <summary>/// 隨機字符串工具類/// </summary>public class RandomTools{/// <summary>/// 隨機系數/// </summary>public static int _RandIndex 0;#region 獲取某個區間的一個隨機數/// <summary>///…

【圖像處理】——Python鼠標框選ROI(感興趣)區域并且保存(含鼠標事件)

鼠標交互切割矩形 接下來,就是本文重點了。先吐個槽,網上有資源,但搜到的都是C++的。本來有點氣餒的,還好,有官網在,文檔寫得很清楚,而且接口函數名字變化不大,稍微做下修改就行了。 import cv2global img global point1, point2 def on_mouse(event, x, y, flags, pa…

c++ 11 override final

C 11添加了兩個繼承控制關鍵字&#xff1a;override和final。 override確保在派生類中聲明的重載函數跟基類的虛函數有相同的簽名。final阻止類的進一步派生和虛函數的進一步重載 出處&#xff1a;http://www.cnblogs.com/zhangdongsheng/ 作者&#xff1a;張東升

泛型方法與橋方法

Java泛型中有存在一種方式叫做類型擦除&#xff0c;也就是說泛型在編譯期間進行類型檢驗上做到有效安全&#xff0c;但是在運行當中&#xff0c;會將該泛型類型用頂層父類&#xff08;若無繼承關系則用Object&#xff09;代替&#xff0c;然后再進行強轉換成目標類型&#xff0…

Pytorch基礎(九)——損失函數

一、概念 損失函數在深度學習領域是用來計算搭建模型預測的輸出值和真實值之間的誤差。 具體實現過程&#xff1a;在一個批次&#xff08;batch&#xff09;前向傳播完成后&#xff0c;得到預測值&#xff0c;然后損失函數計算出預測值和真實值之間的差值&#xff0c;反向傳播…

用程序猿思維、程序設計師思維兩種方式寫求斐波那契數列的方法。

//用Java實現斐波那契數列(Fibonacci) public class Test {public int f(int n)//n代表第幾個數字。程序返回它相應的值{return n>2?f(n-1)f(n-2):1;//看似如此優雅的一句程序}//程序設計師的思維&#xff1a;會重構上面的代碼。讓他們更易讀。推薦&#xff01;&#xff01…

【圖像處理】——圖像的差集、并集、補集、交集以及兩個圖像相減出現負數的處理方法

目錄 目錄 1、交集 2、差集 3、并集 4、補集 5、差為負值,和超過255的解決辦法

Pytorch基礎(十)——優化器(SGD,Adagrad,RMSprop,Adam,LBFGS等)

一、概念 Pytorch中優化器的目的&#xff1a;將損失函數計算出的差值Loss減小。 優化過程&#xff1a;優化器計算網絡參數的梯度&#xff0c;然后使用一定的算法策略來對參數進行計算&#xff0c;用新的參數來重新進行訓練&#xff0c;最終降低Loss。 其中官網提供了13種優化算…