spring事務的相關知識點

2021-10-25 16:14:30 字數 2637 閱讀 3997

4 事務管理失效的情況

所謂spring事務的傳播屬性,就是定義多個事務同時存在的時候,spring應該如何處理這些事務的行為。

簡單來講就是:

乙個開啟事務的方法執行在另乙個開啟了事務的方法中是,當前方法是開啟乙個新的事物還是使用同乙個事務

這些屬性在transactiondefinition中定義,具體常量的解釋見下:

預設的事務傳播屬性是:propagation.required

實際應用中一般使用 propagation.required或 propagation.requires_new

資料庫事務併發問題:問題

說明髒讀

一事務對資料進行了增刪改,但未提交,另一事務可以讀取到未提交的資料。如果第乙個事務這時候回滾了,那麼第二個事務就讀到了髒資料。

不可重複讀

乙個事務中發生了兩次讀操作,第一次讀操作和第二次讀操作之間,另外乙個事務對資料進行了修改,這時候兩次讀取的資料是不一致的

幻讀第乙個事務對一定範圍的資料進行批量修改,第二個事務在這個範圍增加一條資料,這時候第乙個事務就會丟失對新增資料的修改。

序列化不會出現任何問題。只能乙個事務提交後,另外乙個事務才能開始。最安全,但效率也是最差的。

針對資料庫事務併發問題,spring 支援的事務隔離級別如下:

隔離級別解決資料庫事務併發問題的能力

隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。在實際開發中, 為了提公升效能, 事務會以較低的隔離級別執行。

資料庫產品對事務隔離級別的支援

大多數的資料庫預設隔離級別為讀已提交,比如 sqlserver、oracle

少數資料庫預設隔離級別為可重複讀: 比如: mysql innodb

開發中最常用的是 讀已提交read_committed

@service

("cashier"

)public

class

cashierimpl

implements

cashier

}}

/**

* @transactional註解

* 該註解可以新增到類上,也可以新增到方法上

* 如果新增到類上,那麼類中所有的方法都新增上了事務

* 如果新增到方法上,只有新增了該註解的方法才新增了事務

當 bookservice 的 purchase() 方法被另乙個事務方法 checkout() 呼叫時, 它缺省會在現有的事務內執行. 這個預設的傳播行為就是 required. 因此在 checkout() 方法的開始和終止邊界內只有乙個事務. 這個事務只在 checkout() 方法結束的時候被提交

如果出現異常,結果是使用者一本書都買不了。

傳播行為 requires_new 表示該方法必須啟動乙個新事務, 並在自己的事務內執行. 如果有事務在執行, 就應該先掛起它.

如果出現異常,結果是迴圈中哪個purchase() 方法所在的新開啟事務出現異常就導致那本書購買失敗,其他沒有發生異常的新開啟事務對應的書購買成功。

1. @transactional註解的方法不是public方法;

2. 方法丟擲的異常不是runtimeexception;

3. 方法丟擲異常時,使用 try…catch… 進行捕獲,而 catch 語句塊中將異常吞掉了,沒有丟擲runtimeexception異常;

4. @transactional註解所在的類沒有納入spring容器管理;

6. mysql 儲存引擎沒有採用支援事務的儲存引擎 innodb;

事務 相關知識點

1.關閉自動提交功能。2.演示事務 裡面的事務,主要是針對連線來的。1.通過 x.setautocommit false 來關閉自動提交的設定。2.提交事務 x.commit 3.回滾事務 x.rollback test public void testtransaction catch sqlex...

事務相關知識點

原子性 atomicity 事務中所有操作是不可再分割的原子單位。事務中所有操作要麼全部執行成功,要麼全部執行失敗。一致性 consistency 事務執行後,資料庫狀態與其它業務規則保持一致。如轉賬業務,無論事務執行成功與否,參與轉賬的兩個賬號餘額之和應該是不變的。隔離性 isolation 隔離...

事務的相關知識點

一件事情有n個組成單元 要不這n個組成單元同時成功 要不n個單元就同時失敗,就是將n個組成單元放到乙個事務中。開啟事務 start transaction 提交 commit 回滾 rollback 開啟事務 conn.setautocommit false 提交事務 conn.commit 回滾 ...