導致死鎖的SQL示例
從廣義上講包括作業系統 應用程式 資料庫,如果2個程序(會話)相互持有對方的資源,都一直等待對方釋放,這種情況會造成死鎖。
誤解:會話的阻塞不是死鎖,因為其中有一個會話還是可以繼續操作的。
釋放:Oracle會自動檢測死鎖並強制干預釋放-只釋放了死鎖的第一個,另一個還在HANG住。
1.需要建立一個表,用主鍵或惟一約束。
[email protected] bys001>create table test(id varchar2(10) constraint pk__test_id primary key);
Table created.
[email protected]
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
ID NOT NULL VARCHAR2(10)
2.在會話38執行插入操作,值1.
[email protected]
17:43:47 [email protected] bys001>select distinct sid from v$mystat;
SID
----------
38
17:47:13 [email protected] bys001>select * from test;
no rows selected
17:48:49 [email protected] bys001>insert into test values(1);
1 row created.
此時沒有阻塞,可以查詢到38號會話持有了一個模式3的TM表鎖,
因為事務未提交,還持有模式6的事務鎖
17:50:12
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
38 TM 76864 0 3 0 0
38 TX 262157 27843 6 0 0
17:54:07 [email protected] bys001>select object_name from dba_objects where object_id=76864;
OBJECT_NAME
----------------------------------------------------------------------------------------------------
TEST
3.在會話39插入值2
17:49:46 [email protected] bys001>select distinct sid from v$mystat;
SID
----------
39
17:51:07 [email protected] bys001>insert into test values(2);
1 row created.
此時可以查詢到每個會話都產生的有兩個鎖定,BLOCK列全為0,此時沒有阻塞。
17:51:25 [email protected] bys001> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
38 TM 76864 0 3 0 0
38 TX 262157 27843 6 0 0 -----會話38有排他鎖未阻塞會話
39 TM 76864 0 3 0 0
39 TX 327692 28225 6 0 0--------會話39有排他鎖未阻塞會話
4.在會話39插入,值1,此時hang住
17:51:10 [email protected] bys001>insert into test values(1);
在會話38進行查詢資料庫阻塞:
17:57:18 [email protected] bys001> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
38 TM 76864 0 3 0 0
38 TX 262157 27843 6 0 1 ------會話38阻塞會話39,因為會話38未提交,處於未決狀態。
39 TM 76864 0 3 0 0
39 TX 262157 27843 0 4 0----------違反主鍵約束產生的阻塞,所以申請的是4級鎖而非6級。
39 TX 327692 28225 6 0 0
5.在會話38插入,值2,hang住,死鎖產生
此時死鎖被系統檢測到,會話39插入值1的操作被釋放--這個操作在會話38插入值2之前,但是會話38的鎖定還在,需要手工釋放。
也說明死鎖被系統檢測到後,ORACLE會回滾第一個,第二個仍在HANG住,需要手工回滾或提交來解決。
17:51:10 [email protected] bys001>insert into test values(1);
insert into test values(1)
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
此時的會話38的插入操作是HANG住
資料庫的鎖定情況如下:
18:02:40 [email protected] bys001> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
38 TM 76864 0 3 0 0
38 TX 327692 28225 0 4 0 ----違反主鍵約束產生的阻塞,所以申請的是4級鎖而非6級。
38 TX 262157 27843 6 0 0
39 TM 76864 0 3 0 0
39 TX 327692 28225 6 0 1 --------會話39阻塞會話38,因為會話38事務未提交,處於未決狀態。
6.手動解決38號會話的HANG住問題:
在會話39上提交
18:09:36 [email protected] bys001>commit;
Commit complete.
會話38的HANG住解決,報錯如下:
18:08:09 [email protected] bys001>insert into test values(2);
insert into test values(2)
*
ERROR at line 1:
ORA-00001: unique constraint (BYS.PK__TEST_ID) violated
還可以直接在38號上CTRL+C取消語句的執行。
LOCK作用:獨佔業務資源 保證讀一致性 維護事務完整性
LOCK宗旨:沒有併發就沒有鎖,一個人操作資料庫是不會產生鎖的
相關推薦
[譯]async/await中使用阻塞式程式碼導致死鎖
這篇博文主要是講解在async/await中使用阻塞式程式碼導致死鎖的問題,以及如何避免出現這種死鎖。內容主要是從作者Stephen Cleary的兩篇博文中翻譯過來. 原文1:Don'tBlock on Async Code 原文2:why the AspNet
golang 中 鎖的錯誤的用法會導致死鎖。
package main import ( "sync" "time" . "github.com/soekchl/myUtils" ) var mux sync.RWMutex func tt() { Notice() mux.Lock() // 3
訊號處理函式陷阱:呼叫malloc導致死鎖
關於訊號處理signal()、sigaction()等的使用,相信很多人都已熟悉。 這裡主要想講一下訊號處理函式使用上的一個常見陷阱:訊號處理函式必須是可重入函式。如果訊號處理函式不可重入,那麼可能導致很多詭異問題。 《UNIX環境高階程式設計》
mysql先刪除後插入導致死鎖
cti 插入語 adl err values 並不是 trying error 問題 所報的錯誤為:pymysql.err.OperationalError: (1213, ‘Deadlock found when trying to get lock; try resta
【MySQL】Merge Index導致死鎖
水稻:最近有個朋友生產環境出現MySQL死鎖問題,一聽是死鎖,那必須去看看啊,於是饒(si)有(qu)興(huo)致(lai)的研究了好幾天 菜瓜:MySQL死鎖,趕緊分享一下 水稻:能否先讓我裝完X,我從朋友那裡拿到資料結構,復現,分析,查資料,總。。。 菜瓜:今天的菜真香 水稻:。。。好吧,進入正題(資料
導致死鎖的SQL示例
首先感謝: 從廣義上講包括作業系統 應用程式 資料庫,如果2個程序(會話)相互持有對方的資源,都一直等待對方釋放,這種情況會造成死鎖。 誤解:會話的阻塞不是死鎖,因為其中有一個會話還是可以繼續操作的。 釋放:Oracle會自動檢測死鎖並強制干預釋放-只釋放了死鎖的第一個,另
VBS將本地的Excel數據導入到SQL Server中
vbs將本地的excel數據導入到sql server中 VBS將本地的Excel數據導入到SQL Server中最近有個測試,需要將本地的Excel數據導入到SQL Server中,所以就寫了一個這個腳本,供有需要的同學進行參考。因為在此演示測試,所以準備的數據都比較簡單。我們準備將本地的Excel的A列插
常用增刪改查sql示例
sql常用查詢一、插入數據 (1)INSERT INTO Persons VALUES (‘Gates‘, ‘Bill‘, ‘Xuanwumen 10‘, ‘Beijing‘) (2)INSERT INTO Persons (LastName, Address) VALUES
win處navicat直接導出的sql腳本導入Linux mysql報錯問題
錯誤 www. nbsp 提取 xxx .com 根目錄 打開 win 最近幾天在把win上的項目的數據庫轉移到Ubuntu,於是第一件事就是從win處的navicat直接導出sql腳本,然後進入Ubuntu導入的時候會報錯誤,跳過錯誤繼續執行導致數據庫表的缺失。 跨平臺錯
批量將制定文件夾下的全部Excel文件導入微軟SQL數據庫
批量將制定文件夾中的excel數據導入到微軟sql數據庫以下代碼將c:\cs\文件夾下的全部Excle中數據導入到SQL數據庫declare @query vARCHAR(1000)declare @max1 intdeclare @count1 intdeclare @filename varchar(10
將CSV文件中的數據導入到SQL Server 數據庫中
mage 行操作 導入數據 技術分享 img info 註意 sql inf 導入數據時,需要註意 CSV 文件中的數據是否包含逗號以及雙引號,存在時,導入會失敗 選擇數據庫 -> 右鍵 -> 任務 -> 導入數據 ,然後根據彈出的導入導出向導(如下圖)中
最新天貓3輪面試題目:虛擬機器+併發鎖+Sql防注入+Zookeeper
一面 自我介紹、專案介紹 Spring攔截器、實現了哪些方法?底層原理 AOP如何配置,底層原理、2種動態代理,aop註解實現,xml定義切面 Bean的作用域,單例模式是否執行緒安全?惡漢模式是否執行緒安全?bean如何結束生命週期? Spring事務種類,如
plsql檢視是否鎖表,鎖模式等,以及解鎖SQL
--工作中的點滴積累 SELECT l.session_id sid, s.serial#, l.locked_mode 鎖模式, l.oracle_username 登入使用者, l.os_user_name 登入機器使用者名稱,
2018年天貓3輪面試題目:虛擬機器+併發鎖+Sql防注入+Zookeeper
一面 自我介紹、專案介紹 Spring攔截器、實現了哪些方法?底層原理 AOP如何配置,底層原理、2種動態代理,aop註解實現,xml定義切面 Bean的作用域,單例模式是否執行緒安全?惡漢模式是否執行緒安全?bean如何結束生命週期? Spring事務種
oracle 查解鎖sql
oracle 查解鎖sql oracle中的查鎖sql eg: SELECT object_name, machine, s.client_info, s.serial#, s.sid FROM gv$locked_object l, dba_objects o, gv$ses
SQL Server中Table字典資料的查詢SQL示例程式碼
SQL Server中Table字典資料的查詢SQL示例程式碼 前言 在資料庫系統原理與設計(第3版)教科書中這樣寫道: 資料庫包含4類資料: 1.使用者資料 2.元資料 3.索引 4.應用元資料 其中,元資料也叫資料字典,定義如下: 下面這篇文章就來給大家分享一個關於查詢SQL Serve
orale sql一些特殊sql示例
1、rowid(行標示符)概述 rowid是一個用來唯一標記表中行的偽列。它是物理表中行資料的內部地址(唯一),包含兩個地址,其一為指向資料表中包含該行的塊所存放資料檔案的地址,另一個是可以直接定位到資料行自身的這一行在資料塊中的地址 orale 刪除相同的資料
Java死鎖程式碼示例
public class DeadLocak { private final Object left = new Object(); private final Object right = new Object(); public void le
不要使用 Dispatcher.Invoke,因為它可能在你的延遲初始化 Lazy 中導致死鎖
WPF 中為了 UI 的跨執行緒訪問,提供了 Dispatcher 執行緒模型。其 Invoke 方法,無論在哪個執行緒呼叫,都可以讓傳入的方法回到 UI 執行緒。 然而,如果你在 Lazy 上下文中使用了 Invoke,那麼當這個 Lazy<T> 跨執行緒併發時,極有可
sqlserver查詢程序,解鎖 sql語句
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT' ---spid