JPA事務處理(坑)

2021-07-14 12:39:03 字數 1348 閱讀 2236

1、jpa事務

jpa的確沒有提供事務級別的設定,只提供了@transactionattribute 注釋用作定義乙個需要事務的方法。

它可以有以下引數:

1.required:方法在乙個事務中執行,如果呼叫的方法已經在乙個事務中,則使用該事務,否則將建立乙個

新的事務。

2.mandatory:方法必須在乙個事務中執行,也就是說呼叫的方法必須已經有乙個事務,否則新丟擲乙個錯

誤(error)。

3.requiresnew

:方法將在乙個新的事務中執行,如果呼叫的方法已經在乙個事務中,則暫停舊的事務。

4.supports:如果方法在乙個事務中被呼叫,則使用該事務,否則不使用事務。

5.not_supported:如果方法在乙個事務中被呼叫,將丟擲乙個錯誤(error)

如果沒有指定引數,@transactionattribute 注釋使用required 作為預設引數。

requiresnew這種事務使用就是個大坑坑坑,如果你定義了乙個事務,該事務中又呼叫了另乙個方法(該方法也是乙個事務),此時若出現異常,會導致事務回滾,且只回滾了一半,多麼坑。所以此處使用事務時,盡量將涉及到資料庫更新的都放在乙個事務裡面,不要分散,否則會出現意想不到的bug。本人最近深受其害,主要也是自己水平較低。

2、同步方法裡卻沒有達到同步的效果

考慮乙個插入資料的場景,我們需要新增乙個使用者,而使用者的id根據當前資料庫中已經有多少條記錄的count的基礎上加一。我們假設該插入資料的方法已經被標記為synchronized。我們希望的是,每次乙個插入資料的請求過來時,都會等當前的請求處理完成再進入該synchronized方法然而在壓力測試中卻發現,當壓測量達到一定程度時,還是會有報錯,提示id重複。這是為什麼呢?

原來雖然讀和寫在同步塊裡,也寫在乙個事務裡,但是會受到jpa事務隔離級別的影響,出現下一次讀count還是讀到未更新資料的情況。

解決方案:

private concurrenthashmapcurrentloanrequestcount = new concurrenthashmap<>();

int count = 0;

if (currentloanrequestcount.isempty()) else

}submitrequestresult requestresult = requestservice.addnew(request);

if (requestresult.issuccess())

這裡加變數儲存count,避免了去資料庫裡找,迴避掉了這個問題。

PB事務處理

1 資料視窗更新,只要dberror有錯誤,而事先沒有做過任何commit工作,那麼rollback可以回滾到上次commit位置,即上次commit後所有的資料將被回滾。2 如果是直接寫入sql語句,只要資料庫出現錯誤,那麼rollback可以回滾到上次commit的位置,即上次commit後所有...

MySQL事務處理

start transaction,commit和rollback語法 start transaction begin work commit work and no chain no release rollback work and no chain no release set autocom...

ASP事務處理

asp事務處理。測試資料庫為sql server,伺服器為本機,資料庫名為test,表名為a,兩個欄位id int 主鍵標識,num int set conn server.createobject adodb.connection strconn provider sqloledb.1 persi...