在實際開發過程中,特別是在併發高、更新資料量大、關係表比較多的情況下,經常會遇到關於事務的問題。
首先,要了解的是什麼是資料庫的隔離級別。在乙個典型的應用中,併發是不可避免的,多個事務併發執行,操作同乙個資料來完成任務。併發可能會導致以下問題:
髒讀(dirty read):
髒讀發生在乙個事務讀取了被另乙個事務改寫但還未提交的資料時。如果這些改變在稍後被回滾,那麼之前的事務讀取的到資料就是無效的。
不可重複讀(nonrepeatable read):
不可重複讀發生在乙個事務執行相同的查詢兩次或兩次以上,但每一次的查詢結果不同時。這通常是由於另乙個併發的事務在兩次查詢之間更新了資料。
幻讀(phantom read):
幻讀是乙個事務讀取幾行記錄後,另乙個事務插入了一些記錄,幻讀就發生了。在後來的查詢中第乙個事務就會發現有一些原來沒有的額外的記錄。
spring的事務隔離級別
isolation_default:
使用資料庫預設的隔離級別。
isolation_read_uncommitted:
允許讀取改變了的還未提交的資料,可能導致髒讀、不可重複讀和幻讀。
isolation_read committed:
允許併發事務提交之後讀取,可以避免髒讀,可能導致重複讀和幻讀。
isolation_repeatable_read:
對相同欄位的多次讀取結果一致,可導致幻讀。
isolation_serializable:
完全服從acid的原則,確保不發生髒讀、不可重複讀和幻讀。
可以根據自己的系統對資料的要求採取適應的隔離級別,因為隔離牽涉到鎖定資料庫中的記錄,對資料正性要求越嚴格,併發的效能也越差。
isolation_read_committed
propagation_required,-exception
propagation_required,readonly
propagation_required,readonly
propagation_required,readonly
spring的事務傳播行為
spring事務的傳播行為說的是當乙個方法呼叫另乙個方法時,事務該如何操作。
propagation_mandatory:
該方法必須執行在乙個事務中。如果當前事務不存在則丟擲異常。
propagation_nested:
如果當前存在乙個事務,則該方法執行在乙個巢狀的事務中。被巢狀的事務可以從當前事務中單獨的提交和回滾。如果當前不存在事務,則開始乙個新的事務。各廠商對這種傳播行為的支援參差不齊,使用時需注意。
propagation_never:
當前方法不應該執行在乙個事務中。如果當前存在乙個事務,則丟擲異常。
propagation_not_supported:
當前方法不應該執行在乙個事務中。如果乙個事務正在執行,它將在該方法的執行期間掛起。
propagation_required:
該方法必須執行在乙個事務中。如果乙個事務正在執行,該方法將執行在這個事務中。否則,就開始乙個新的事務。
propagation_requires_new:
該方法必須執行在自己的事務中。它將啟動乙個新的事務。如果乙個現有的事務正在執行,將在這個方法的執行期間掛起。
propagation_supports:
當前方法不需要事務處理環境,但如果乙個事務已經在執行的話,這個方法也可以在這個事務裡執行。
spring 事務傳播行為
事務傳播行為種類 spring在transactiondefinition介面中規定了7種型別的事務傳播行為,它們規定了事務方法和事務方法發生巢狀呼叫時事務如何進行傳播 事務傳播行為型別 事務傳播行為型別 說明propagation required 如果當前沒有事務,就新建乙個事務,如果已經存在乙...
Spring事務傳播行為
你們說一下什麼是傳播行為,有幾種傳播行為,是不是有7種傳播行為,你們看一段 就知道傳播行為是怎麼用的,它是產生在 多個事務中,我定義乙個 class userservice 這個行為你不會不知道,行為是基礎知識,userdao.add 是不是這樣的,我在add方法上加上註解,logservice.a...
Spring事務傳播行為
什麼是spring事務傳播行為?事務傳播行為用來描述由某乙個事務傳播行為修飾的方法被巢狀進另乙個方法的時,事務如何傳播。假設servicea 中方法a 呼叫 serviceb中方法 b b被事務修飾 那麼會有兩種情況 方法a有事務,方法b有事務 方法a沒有事務,方法b有事務 spring中的事務傳播...