使用propagation
指定事務的傳播行為, 即當事務方法被另乙個事務方法呼叫時, 必須指定事務應該如何傳播(方法可能繼續在現有事務中執行, 也可能開啟乙個新事務, 並在自己的事務中執行)
傳播屬性
描述required★如果有事務在執行,當前的方法就在這個事務內執行,否則就啟用乙個新的事務,並在自己的事務內執行(預設值)
required_new★當前的方法必須啟動新事務,並在它自己的事務內執行。如果有事務正在執行,應該將它掛起
supports
如果有事務在執行,當前的方法就在這個事務內執行。否則它可以不執行在事務中
not_supported
當前的方法不應該執行在事務中。如果有執行的事務,將它掛起
mandatory
當前的方法必須執行在事務內部,如果沒有正在執行的事務,就丟擲異常
never
當前的方法不應該執行在事務中。如果有執行的事務,就丟擲異常
nested
如果有事務在執行,當前的方法就應該在這個事務的巢狀事務內執行。否則就啟動乙個新的事務,並在它自己的事務內執行
使用isolation
指定事務的隔離級別。從理論上來說, 事務應該彼此完全隔離, 以避免併發事務所導致的問題. 然而, 那樣會對效能產生極大的影響, 因為事務必須按順序執行. 在實際開發中,為了提公升效能, 事務會以較低的隔離級別執行。
事務的隔離級別要得到底層資料庫引擎的支援, 而不是應用程式或者框架的支援.
隔離級別
描述default
使用底層資料庫的預設隔離級別。對於大多數資料庫來說,預設隔離級別都是read_commited
(預設值)
read_uncommitted
允許事務讀取未被其他事務提交的變更。髒讀,不可重複讀和幻讀的問題都會出現
read_commited
只允許事務讀取已經被其他事務提交的變更。可以避免髒讀,但不可重複讀和幻讀問題仍然可能出現
repeatable_read
確保事務可以多次從乙個欄位中讀取相同的值。在這個事務持續期間,禁止其他事務對這個字段進行更新。可以避免髒讀和不可重複讀,但幻讀的問題仍然存在
serializable
確保事務可以從乙個表中讀取相同的行,在這個事務持續期間,禁止其他事務對該錶執行插入,更新和刪除操作。所有併發問題都可以避免,但效能十分低下
事務隔離級別
髒讀不可重複讀
幻讀讀未提交(read-uncommitted)是是
是讀已提交(read-committed)否是
是可重複讀(repeatable-read)否否
是序列化(serializable)否否
否髒讀:事務a讀取了事務b更新的資料,然後b回滾操作,那麼a讀取到的資料是髒資料
不可重複讀:事務 a 多次讀取同一資料,事務 b 在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果 不一致。
幻讀:系統管理員a將資料庫中所有學生的成績從具體分數改為abcde等級,但是系統管理員b就在這個時候插入了一條具體分數的記錄,當系統管理員a改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。
小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
預設情況下只有未檢查異常(runtimeexception和error型別的異常)會導致事務回滾. 而受檢查異常不會.
事務的回滾規則可以通過@transactional註解的rollbackfor和norollbackfor屬性來定義. 這兩個屬性被宣告為 class 型別的, 因此可以為這兩個屬性指定多個異常類.
由於事務可以在行和表上獲得鎖, 因此長事務會占用資源, 並對整體效能產生影響. 如果乙個事物只讀取資料但不做修改, 資料庫引擎可以對這個事務進行優化.
//開啟事務之前要先配置事務管理器並開啟事務註解,然後新增@transactional的方法或類會被spring事務管理器管理
@service
("bookshopservice"
)public
class
bookshopserviceimpl
implements
bookshopservice
)@transactional
(propagation=propagation.requires_new,
isolation=isolation.read_committed,
readonly=
false
, timeout=3)
@override
public
void
purchase
(string username, string isbn)
catch
(interruptedexception e)
//1. 獲取書的單價
int price = bookshopdao.
findbookpricebyisbn
(isbn)
;//2. 更新數的庫存
bookshopdao.
updatebookstock
(isbn)
;//3. 更新使用者餘額
bookshopdao.
updateuseraccount
(username, price);}
}
Spring事務管理
spring是ssh中的管理員,負責管理其它框架,協調各個部分的工作。今天一起學習一下spring的事務管理。spring的事務管理分為宣告式跟程式設計式。宣告式就是在spring的配置檔案中進行相關配置 程式設計式就是用註解的方式寫到 裡。下面先說宣告式 spring配置檔案中關於事務配置總是由三...
spring事務管理
一 xml配置事務 二 註解的方式配置事務 bean id txmanaager class org.springframework.orm.hibernate3.hibernatetransactionmanager property name sessionfactory ref session...
spring 事務管理
和資料庫打交道的碼農都知道事務,事務有4大特徵,分別是原子性,一致性,隔離性,永續性。而spring 對事物提供了良好的支援,和api,通過簡單的配置,則可以減低程式設計師重複的操作。1.原子性 原子性指的是乙個事務內的所有操作要麼全部應用到資料庫,要麼取消對資料庫的操作。2.一致性 一致性和原子性...