1. 程式人生 > >sql server 死鎖簡易例子

sql server 死鎖簡易例子

產生死鎖的原因主要是:
(1) 因為系統資源不足。
(2) 程序執行推進的順序不合適。
(3) 資源分配不當等。
如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則
就會因爭奪有限的資源而陷入死鎖。其次,程序執行推進順序與速度不同,也可能產生死鎖。
產生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個程序使用。
(2) 請求與保持條件:一個程序因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之
一不滿足,就不會發生死鎖。
死鎖的解除與預防:
理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和
解除死鎖。所以,在系統設計、程序排程等方面注意如何不讓這四個必要條件成立,如何確
定資源的合理分配演算法,避免程序永久佔據系統資源。此外,也要防止程序在處於等待狀態

的情況下佔用資源。因此,對資源的分配要給予合理的規劃。

開啟三個查詢視窗

視窗1:建立測試表

USE [test]
GO
/****** Object:  Table [dbo].[t1]    Script Date: 2018/5/29 18:09:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[t1](
	[id] [int] NULL
) ON [PRIMARY]

GO
/****** Object:  Index [cisdfsdf]    Script Date: 2018/5/29 18:09:56 ******/
CREATE CLUSTERED INDEX [cisdfsdf] ON [dbo].[t1]
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
INSERT [dbo].[t1] ([id]) VALUES (1)
GO
INSERT [dbo].[t1] ([id]) VALUES (2)
GO
select * from t1


視窗2:

--execute 1
begin tran
--execute 1
update t1 set id=id where id=1
--execute 3
select * from t1 where id=2
--execute 6
rollback
視窗3:
--execute 2
begin tran
--execute 2
update t1 set id=id where id=2
--execute 4
select * from t1 where id=1
--execute 5
rollback

按照execute 1、2、3、4、5、6依次選中執行

相關推薦

sql server 簡易例子

產生死鎖的原因主要是:(1) 因為系統資源不足。(2) 程序執行推進的順序不合適。(3) 資源分配不當等。如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。其次,程序執行推進順序與速度不同,也可能產生死鎖。產生死鎖的四

sql server 排查

getdate rest spi 排它鎖 pro 版本 sql ack proxy 原文:sql server 死鎖排查 記得以前客戶在使用軟件時,有偶發出現死鎖問題,因為發生的時間不確定,不好做問題的重現,當時解決問題有點棘手了。 現總結下查看死

SQL SERVER查詢和殺死程序

關於死鎖的產生原理,想了解更多,可以點選這裡 查詢死鎖程序 select         request_session_id spid,       

sql server解決方案

問題場景:在客戶那碰到一個操作卡死的現象 問題解決: 1、如何掛鉤是死鎖問題:通過程式碼跟蹤,發現是指執行一個SQL語句超時,因此猜想可能是表鎖住了 2、如果確認是思索問題:通過SQL發現死鎖,以下是相關的SQL  select request_session_id 

SQL Server診斷--同一行資料在不同索引操作下引起的

死鎖概述 對於資料庫中出現的死鎖,通俗地解釋就是:不同Session(會話)持有一部分資源,並且同時相互排他性地申請對方持有的資源,然後雙方都得不到自己想要的資源,從而造成的一種僵持的現象。當然,在任何一種資料庫中,這種僵持的情況不會一直持續下去,因為一直持續下去雙方永遠都無法執行,沒有任何意義,在

SQL Server的解除方法

Create proc p_lockinfo @kill_lock_spid bit=1, --是否殺掉死鎖的程序,1 殺掉, 0 僅顯示 @show_spid_if_nolock bit=1 --如果沒有死鎖的程序,是否顯示正常程序資訊,1 顯示,0 不顯示 a

SQL Server產生原因及解決辦法

其實所有的死鎖最深層的原因就是一個:資源競爭 表現一:   一個使用者A 訪問表A(鎖住了表A),然後又訪問表B,另一個使用者B 訪問表B(鎖住了表B),然後企圖訪問表A,這時使用者A由於使用者B已經鎖住表B,它必須等待使用者B釋放表B,才能繼續,好了他老人家就只好老老實實

SQL Server總結

CREATE Table #Who(spid int,    ecid int,    status nvarchar(50),    loginname nvarchar(50),    hostname nvarchar(50),    blk int,    dbname nvarchar(50),  

SQL SERVER機制(一)——概述(的種類與範圍)

row 定性 針對 共享 互斥 drop 問題 停止 共享鎖 SQL SERVER的鎖機制系列: SQL SERVER的鎖機制(一)——概述(鎖的種類與範圍) SQL SERVER的鎖機制(二)——概述(鎖的兼容性與可以鎖定的資源) SQL SERVER的鎖機制(三)

sql server 的osql 使用例子

soft where -s 語句 用例 txt form utili tor 一次性執行一個語句並輸出到文件: osql -Usa -dSCGWYDJ2012 -P -S192.168.56.1 -Q "exit( SELECT top 1 * FROM A08)" -o

查看Sql Server的表以及解

代碼 pan 數據庫名 數據庫 被鎖 varchar weight _id col 查看被鎖表: select spId from master..SysProcesses where db_Name(dbID) = ‘數據庫名稱‘ and spId <

SQL SERVER 事務 (3)

資料庫的髒讀、不可重複讀、幻讀都和事務的隔離性有關。所以先了解一下事務的4大特性。 事務的4大特性(ACID): 原子性(Atomicity):事務是資料庫的邏輯工作單位,它對資料庫的修改要麼全部執行,要麼全部不執行。 一致性(Consistemcy):事務前後,資料庫的

sql server事務 儲存過程 索引 觸發器

1.事務:保證一個多操作的事情全部完成,否則回到做之前的狀態 begin try begin tran–設定反悔點,開啟事務 delete from UserInfo where UserId>5 delete from ClassInfo commit tran–不反悔,提交事務 e

SQL SERVER-UpdateRowSource 外帶簡單例子

UpdateRowSource是DbCommand的一個屬性,當DbCommand把本地變化更新到資料庫的時候,UpdateRowSource可能把資料庫的變化帶回本地。 用例子來說: 假設有一個數據庫叫做My,我們定義一個表叫做MyTable: use MyTest; create tab

SQL Server查詢等待

SELECT der.[session_id], [request_id], percent_complete, estimated_completion_time/1000/60, con.[client_net_address], con.local_net_address, [star

Java一個例子

一.死鎖的概念在計算機系統中同時具備下面四個必要條件時,那麼會發生死鎖。    〈1〉互斥條件。即某個資源在一段時間內只能由一個程序佔有,不能同時被兩個或兩個以上的程序佔有。    〈2〉不可搶佔條件。程序所獲得的資源在未使用完畢之前,資源申請者不能強行地從資源佔有者手中奪取

PL/SQL 出現解決辦法

在PL/SQL中操作資料表時,長時間沒反應,並且編輯某個表中資料時,出現“record is locked by another user”等情況,即出現了死鎖。 下面,簡述解決辦法: step1.P

一個執行緒例子

public class DeadThread { A a = new A(); B b = new B(); public DeadThread() { a.

SQL server操作

select   request_session_id   spid,OBJECT_NAME(resource_associated_entity_id) tableName    from   sys.dm_tran_locks where resource_type=

java多執行緒之例子

在java多執行緒編寫程式中特別害怕的一種情況就是死鎖,他會讓程式死在哪裡不在繼續執行下面就來看一個死鎖的例子: /** * 死鎖的例子 */ public class SiSuoTest