java spring巢狀事務詳情和事務傳播型別
一個有事務的方法,去呼叫另一個有事務的方法,會怎麼樣?
一個沒有事務的方法,去呼叫一個有事務的方法,會怎麼樣?
多事務巢狀問題解答
1、在同一個類中,一個無事務方法呼叫另一個有事務註解方法(比如@Async,@Transational)的方法,註解事務是不會生效的
2、在同一個類中,一個有事務方法呼叫另一個有事務註解方法(比如@Async,@Transational)的方法,只有外層事務有效,被調的註解事務是不會生效的
3、在不同類中,一個無事務方法呼叫另一個有事務註解方法(比如@Async,@Transational)的方法,有註解事務是生效的
4、在不同類中,一個有事務方法呼叫另一個有事務註解方法(比如@Async,@Transational)的方法,兩個方法都有事務
程式碼示例:
@Service
public class PersonServiceImpl implements PersonService {
@Autowired
PersonDao personDao;
@Override
@Transactional
public boolean addPerson(Person person) {
boolean result = personDao.insertPerson(person)>0 ? true : false;
return result;
}
@Override
@Transactional
public boolean updatePersonByPhoneNo(Person person) {
boolean result = personDao.updatePersonByPhoneNo(person)>0 ? true : false;
addPerson(person); //測試同一個類中@Transactional是否起作用
return result;
}
}
上述的情況,說白了,就是在一個Service內部,事務方法之間的巢狀呼叫,不管被呼叫普通方法和事務方法,都不會開啟新的事務! 鄭州哪家人流醫院好
spring 在掃描bean的時候會掃描方法上是否包含@Transactional註解,如果包含,spring會為這個bean動態地生成一個類(即代理類,proxy),代理類是繼承原來那個bean的。此時,當這個有註解的方法被呼叫的時候,實際上是由代理類來呼叫的,代理類在呼叫之前就會啟動transaction。然而,如果這個有註解的方法是被同一個類中的其他方法呼叫的,那麼該方法的呼叫並沒有透過代理類,而是直接透過原來的那個bean,所以就不會啟動transaction,我們看到的現象就是@Transactional註解無效。
總結:spring採用動態代理機制來實現事務控制,動態代理最終都是要呼叫原始物件的,而原始物件在去呼叫方法時,是不會再觸發代理了!
重點:自己也可以實現一個事務,原理就是AOP中的動態代理
解決的巢狀事務方法就簡單了(兩種):
把這兩個方法分開到不同的類中,把註解加到類名上面;
Spring事務7種傳播屬性:
REQUIRED(require)預設級別:不存在事務則建立一個事務
REQUIRES_NEW(requires_new):新建一個自己的事務,不論當前是否存在事務,已存在的事務掛起
NESTED(nested):存在事務則執行在巢狀事務中,不管是呼叫者還是被呼叫者不存在則建立一個事務
SUPPORTS(supports):存在事務則加入,不存在也可以
NOT_SUPPORT(not_support):以非事務方式執行,如果當前存在事務,則把當前事務掛起
MANDATORY(mandatory):如果當前存在事務,則執行在當前事務中,如果當前無事務,則丟擲異常,也即父級方法必須有事務
NEVER(never):當前方法不能執行在事務中,存在事務則丟擲異常
程式碼中實現:
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void addEmpByRequired(String name) {
Employee employee = new Employee();
employee.setDeptId(1);
employee.setName(name);
employee.setAddress("邯鄲");
employeeMapper.insertSelective(employee);
departmentService.addDept("jishubu");
int i = 1/0;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2667691/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 什麼是事務、事務特性、事務隔離級別、spring事務傳播特性?Spring
- Spring事務傳播行為詳解Spring
- spring事務的傳播Spring
- Spring事務配置的五種方式和spring裡面事務的傳播屬性和事務隔離級別Spring
- Spring 事務傳播行為Spring
- spring事務之傳播性Spring
- spring事務傳播機制Spring
- Spring事務傳播行為Spring
- Spring事務的傳播行為和隔離級別Spring
- Spring中事務的傳播屬性詳解Spring
- Spring事務的傳播屬性Spring
- spring的事務傳播機制Spring
- Spring 事務的傳播行為Spring
- Spring Boot事務傳播機制 - DZone JavaSpring BootJava
- 宣告式事務能否和程式設計式事務巢狀使用?程式設計巢狀
- Oracle 巢狀事務 VS 自治事務Oracle巢狀
- sql server中巢狀事務*SQLServer巢狀
- golang的巢狀事務管理Golang巢狀
- 碰到巢狀事務-筆記巢狀筆記
- javaEE支援巢狀事務嗎,Spring支援嗎Java巢狀Spring
- Spring事務:傳播行為與隔離級別Spring
- Spring review--事務的傳播特性SpringView
- [轉帖]帶你讀懂Spring 事務——事務的傳播機制Spring
- Spring的事務管理(一) Spring事務管理的實現,事務的屬性(隔離級別,傳播行為,只讀)Spring
- 關於 MySQL 的巢狀事務MySql巢狀
- Spring事務的傳播行為案例分析Spring
- Spring 七種事務傳播性介紹Spring
- Laravel 之巢狀事務 transactions 實現Laravel巢狀
- 儲存過程中巢狀事務儲存過程巢狀
- hibernate能否實現巢狀事務巢狀
- CYmysql事務隔離級別詳情dbzMySql
- SqlServer事務詳解(事務隔離性和隔離級別詳解)SQLServer
- SQL Server中存在真正的“事務巢狀”SQLServer巢狀
- CRUD更要知道的Spring事務傳播機制Spring
- Spring事務回滾情況Spring
- 會計事務型別型別
- 編輯 Java 中的事務 — JDBC 事務和 JTA 事務JavaJDBC
- 本地事務和分散式事務的區別分散式