1. 程式人生 > >導致死鎖的SQL示例

導致死鎖的SQL示例

首先感謝:
從廣義上講包括作業系統 應用程式 資料庫,如果2個程序(會話)相互持有對方的資源,都一直等待對方釋放,這種情況會造成死鎖。
誤解:會話的阻塞不是死鎖,因為其中有一個會話還是可以繼續操作的。
釋放:Oracle會自動檢測死鎖並強制干預釋放-只釋放了死鎖的第一個,另一個還在HANG住。

1.需要建立一個表,用主鍵或惟一約束
[email protected] bys001>create table test(id varchar2(10) constraint pk__test_id primary key);

Table created.
[email protected]
bys001>desc test;
Name                                                  Null?    Type
----------------------------------------------------- -------- ------------------------------------
ID                                                    NOT NULL VARCHAR2(10)

2.在會話38執行插入操作,值1.
[email protected]
bys001>set time on
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
[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
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);
QQ圖片20130820175538.jpg
在會話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
2.jpg

此時的會話38的插入操作是HANG住
3.jpg

資料庫的鎖定情況如下:
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