@transactional的屬性:propagation,事務傳播行為,列舉型別 propagation。
注意:事務傳播行為在同一service類中是無效的,只有在aservice 呼叫 bservice才有效。因為事務處理是通過aop**攔截工作的,在同一service裡呼叫,不會再觸發**方法攔截。
支援當前事務,如果不存在新事務,則建立新事務。
支援當前事務,如果不存在,則以非事務方式執行。
演示案例:如果在呼叫此service的insert方法之前,並沒有呼叫過任何有@transactional註解的方法,也沒有手動開啟事務,那以下方法將會插入資料庫成功。
/**
* 設定傳播行為
* @param user
* @return
*/@transactional(propagation = propagation.supports)
public int insert(user user)
return insert;
}
支援當前事務,如果不存在,丟擲異常。
報錯資訊:no existing transaction found for transaction marked with propagation 『mandatory』
建立乙個新事務,如果存在當前事務,則暫停當前事務。
演示案例:在employeeservice的insert方法,事務傳播行為設定propagation.requires_new。
@service
public class employeeservice
}
在userservice.insert()方法中,呼叫了employeeservice.insert()。此時會在employeeservice.insert()方法執行前,開啟乙個新的事務。在userservice.insert()方法中丟擲異常回滾事務,對employeeservice.insert()
不會有影響,所以會插入資料庫成功。而userservice.insert()插入資料庫失敗
@transactional
public int insert(user user)
return insert;
}
非事務性執行,如果存在當前事務,則暫停當前事務。
演示案例:與 propagation.requires_new與它相反的意思,
@transactional(propagation = propagation.not_supported)
public int insert(employee employee)
return insert;
}
以非事務方式執行,如果存在事務,丟擲異常。
例如:aservice方法呼叫bservice的方法,他們都同樣有@transactional註解,而且bservice的事務傳播行為是propagation = propagation.never, 那麼就會報錯了。
報錯資訊:existing transaction found for transaction marked with propagation 『never』
個人感覺這個傳播行為意義不大。應該是防止不需要事務操作的業務方法,讓有事務的方法呼叫了。所以我們寫程式的時候,應該避免這種問題,而不是用這個事務傳播行為去控制,畢竟報錯會讓我們非常難受。可以見得spring想得真的非常周到。
如果存在當前事務,就作為這個事務的巢狀事務執行(begin中begin); 如果沒有事務執行,新建乙個事務執行。
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中的事務傳播...