postgresql提供了多種資料完整性的保證機制,如約束、觸發器、約束和鎖管理等。
12.1 事務管理簡介
事務是postgresql中的基本工作單元,是使用者定義的乙個資料庫操作序列,這些操作要麼全做要麼全不做,是乙個不可分割的工作單位。
事務的屬性:
原子性(atomic):事務必須是原子工作單元;對其資料修改,要麼全執行,要麼全不執行。
一致性(consistent):事務在完成時,必須使所有的資料都保持一致狀態。
隔離性(isolated):由併發事務所做的修改必須與任何其他併發事務所做的修改隔離。
永續性(durable):事務完成之後,它對系統的影響是永續性的。
【例12.1】向person表插入3條學生記錄,此時發現是不應該插入的,進行回滾操作。
begin
;insert
into person values
(1003
,'路飛',80
,'10456354');
insert
into person values
(1004
,'張露',85
,'56423424');
insert
into person values
(1005
,'魏波',70
,'41242774');
rollback
transaction
;commit
;
可以看到執行事務前後表中內容沒有變化,這是因為事務撤銷了對錶的插入操作。
12.2 postgresql的併發機制
postgresql支援多使用者共享同一資料庫,但是當多個使用者對同乙個資料庫進行修改時會產生併發問題。從而產生下面的問題
髒讀:幻讀;
不可重複性讀取。
在postgresql中,定義了4個事務隔離級別:
隔離級別
髒讀幻讀
不可重複性讀取
讀未提交
可能可能
可能讀已提交
不可能可能
可能可重複讀
不可能可能
不可能可序列讀
不可能不可能
不可能12.3 鎖機制
1、鎖的型別:postgresql中提供了3種鎖模式,分別為spinlock、lwlock、regularlock。
spinlock(自旋鎖):使用互斥訊號,與作業系統和硬體環境比較密切,事務結束時不能自動釋放。
lwlock(輕量級鎖):主要提供對共享儲存器的資料機構的互斥訪問,特點主要是有等待佇列的無死鎖檢測。另外,事務結束時,可以自動釋放lwlock鎖。lwlock鎖分為排他模式和共享模式。
regulatlock(常規鎖):為一般資料庫事務管理所指的鎖,主要特點為有等待佇列、有死鎖檢測和能自動釋放鎖。2、死鎖:
死鎖的原因:
可能會造成死鎖的資源 減少死鎖的策略。【例12.2】有乙個現成的表person,判斷此表,如果有外來鍵,則在插入資料時使用share(共享鎖),事務如下:
begin
;lock
table person in
share
mode
;select id from person
where name =
'star wars: episode i - the phantom menace'
;-- 如果記錄沒有返回則rollback
insert
into person_user_comments values
(_id_,
'great! i was waiting for it for so long!');
commit
;
【例12.3】如果乙個表含有主鍵,則在刪除時,進行share row exclusive(共享行排他鎖)操作。事務如下:
begin
;lock
table person in
share
row exclusive mode
;delete
from person_user_comments where id in
(select id from films where rating <5)
;delete
from person where rating <5;
commit
疑問1:事務和鎖在應用上的區別是什麼?
疑問2:事務和鎖有什麼關係?
geode springboot下的事務處理
springboot啟用事務 enabletransactionmanagement service層方法開啟事務 transactional 此時方法裡面如果有geode儲存更新操作,就算是異常,關聯式資料庫可以回滾,而geode是不會回滾的,這個事務並沒有 到geode的事務,此時需要自己開始一...
如何使用 Transact SQL 執行事務處理
以下儲存過程闡明了如何在 transact sql 儲存過程內部執行事務性資金轉帳操作。create procedure moneytransfer fromaccount char 20 toaccount char 20 amount money asbegin transaction perf...
begintrans返回值 VB中的事務處理
vb 中的事務處理有一下兩種方式 1.conn.begintrans 開始執行語句 conn.execute sql if err.number 0 then conn.committrans 提交事務 else conn.rollbacktransaction msgbox 失敗end if 2....