oracle事務與鎖

2021-06-22 17:45:34 字數 2813 閱讀 2149

一.事務有4個特性,它們分別是原子性,一致性,分離性,永續性.

1)原子性:事務的原子性是指,事務中程式是資料庫的邏輯工作單位,它對資料的修改要麼全部執行,要麼完全不執行.原子也意味著不可分割,不管有多少程式,只要在同乙個事務中,那麼它們就是乙個整體,如果都執行成功才意味著該事務成功,而有乙個操作失敗,那麼同乙個事務中的其他操作即使執行成功也沒有用,事務會使其全部撤銷.

2)一致性:事務的一致性指事務執行的前後資料庫都必須處於一致性狀態,它是相對髒讀而言的.只有在事務完成後才能被所有使用者看見.保證了資料的完整性.例如在銀行轉賬時,從a賬戶取款但沒有放到b賬戶中時資料是不一致的,同時也是不完整的,其他使用者此時不能看到a中修改後的資料,只有存到b賬戶中,交易完成並提交事務,這時才算資料一致,所有使用者也會看到修改後的資料.

3)分離性:分離性是指併發事務之間不能相互的干擾.也就是說,乙個事務操作的資料不會被其他事務看到和操作.

4)永續性:永續性是指一旦事務提交完成,那麼這將是對資料永久的修改,即使被修改的資料遭到破壞,也不會出現回到修改之前的情況.

二.鎖oracle處理資料時用到的鎖是自動獲取的,我們不用對此有過多的關注,但oracle允許我們手動鎖定資料.oracle利用很低的約束提供了最大程式的併發性.例如某會話正在修改一條記錄,那麼僅僅該記錄會被鎖定.而其他會話可以隨時做讀取操作,但讀取的依然是修改前的資料.

oracle的鎖保證了資料的完整性.例如,當一人會話對錶a的某行記錄進行修改時,另乙個會話也來修改該行記錄,在沒有任何處理的情況下保留的資料會有隨時機,而這種資料是沒有作保意義的,為臟資料.如果此時使用了行級鎖,第乙個會話修改記錄時封鎖該行,那麼第二個會話此時只能等待,這樣就避免了髒資料的產生.

鎖的分類

兩種模式鎖:排他鎖(x鎖)和共享鎖(s鎖)

排他鎖也叫寫鎖.這種模式的鎖防止資源的共享,用做資料的修改.假如有事務t給資料a加上該鎖,那麼其他的事務將不能對a加任何的鎖,所以此時只允許t對該資料進行讀取和修改,直到事務完成將該型別的鎖釋放為止.

共享鎖也可以叫讀鎖.該模式鎖下的資料只能被讀到,不能被修改.如果有事務t給資料a加上共享鎖後,那麼其他事務不能對其加排他鎖,只能加共享鎖.加了該鎖的資料可以被併發地讀取.鎖是實現併發的主要手段,很多都是由資料庫自動管理,當事務提交後會自動釋放鎖.

按作用物件又可分為dml鎖,ddl鎖和內部閂鎖.

dml鎖:該型別的鎖被稱為資料鎖,用於保護資料.主要保證了併發訪問時資料的完整性.再細分,又可分為行級鎖(tx,也可叫事務鎖)和表級鎖(tm).

ddl鎖:可以保護模式中的物件的結構.

內部閂鎖:保護資料庫的內部結構,完全自動呼叫.

1.tx:當修改表中的某行記錄時,需要對將要修改的記錄加行級鎖,防止兩個事務同時修改相同記錄,事務結束,該鎖也會釋放,是粒度最細的鎖.該鎖只能屬於排他鎖(x鎖).

2.tm:主要用用是防止在修改表的資料時,表結構發生變化.例如,會話s在修改表a的資料時它會得到表a的tm鎖,而此時將不允許其他會話對該錶進行變更或刪除操作.表級鎖包含如下幾種模式:

rs(行級共享鎖,row share):該模式下不允許其他的並行會話對同一張表使用排它鎖,但允許其利用dml語名或lock命令鎖定同一張表中的其他記錄.select ...from for update語名就是給記錄加上了rs鎖.

rx(行級排他鎖,row exclusive):該模式下允許並行會話對同一張表的其他資料進行修改,但不允許並行會話對同一張表使用排他鎖.

s(共享鎖,share):該模式下,不允許會話更新表,但允許對錶新增rs鎖.

srx(共享行級排他鎖,share row exclusive):該模式下,不能對同一張表進行dml操作,也不能新增s鎖.

x(排他鎖,exclusive):該模式下,其他的並行會話不能對錶dml和ddl操作,該錶只能讀.

死鎖的乙個例子:

開啟兩個會話s1和s2,這兩個會話都設定會話自動提交為off

1.在會話s1執行:

update emp t set t.comm=320 where t.empno=7499;

但不要提交事務;

2.在會話s2執行:

update emp t set t.comm=520 where t.empno=7521;

但不要提交事務;

3.回到會話s1執行:

update emp t set t.comm=521 where t.empno=7521;

再執行提交,會發現提交不了.因為等待會話s2,而會話s2又在等待s1.

4.再回到會話s2執行

update emp t set t.comm=321 where t.empno=7499;

再執行提交,會發現出現了死鎖.因為等待會話s1,而會話s1又在等待s2.

出現死鎖,又不能自動解鎖,那此時只能手動關閉對應的會話來解決這樣的死迴圈等待鎖,這種情況,之前執行的事務都會回滾.(注:關閉plsql developer是會關閉當前會話,死鎖當然就解決.),順便提一下,正常退出sql*plus會自動提交事務,非正常退出則會回滾事務.plsql developer正常退出但不明確寫commit,也會提交事務.

要檢視和關閉會話需要相應的許可權(暫時不了解會話許可權是什麼名稱),當乙個使用者賦予了dba許可權,那麼此使用者就可以檢視所有會話和關閉某個會話.

grant dba to scott;

plsql developer來檢視會話:工具-->會話

plsql developer來關閉某個會話:從上面的會話列表中選擇要關閉的會話-->右鍵選擇關掉.

ORACLE 事務併發 鎖

首先了解乙個概念,沒有併發就沒有鎖。select s.sql id,parsing schema name,sql fulltext,t.status start time,last active time,last load time from v transaction t,v sql s wh...

mysql事務與鎖機制 mysql事務與鎖機制

在併發下事務會容易出現的一些問題 資料更新丟失 兩個事務同時操作一條資料,乙個事務因為異常導致資料更新丟失 髒讀 乙個失誤開始讀取了某行資料,另外乙個事務已經更新了此資料但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作都被回滾。不可重複讀 乙個事務對同一行資料重複讀取兩次,但是卻得到了不同的...

laravel 事務與鎖

接下來我們就測試一下 介面testname public function testname 測試結果 當我訪問test介面後,在訪問testname。很明顯,因為test介面把user表中id為1的資料鎖住,所以testname介面一直處在request中,無法完成。並且當我把2個介面都取消訪問後...