本篇文章給大家分享的是有關(guān)Spring事務(wù)的原理是什么,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名與空間、網(wǎng)站空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、宿松網(wǎng)站維護(hù)、網(wǎng)站推廣。
1.Spring事務(wù)的原理
Spring 事務(wù)管理分為編碼式和聲明式的兩種方式。編程式事務(wù)指的是通過(guò)編碼方式實(shí)現(xiàn)事務(wù);聲明式事務(wù)基于 AOP,將具體業(yè)務(wù)邏輯與事務(wù)處理解耦。聲明式事務(wù)管理使業(yè)務(wù)代碼邏輯不受污染, 因此在實(shí)際使用中聲明式事務(wù)用的比較多。聲明式事務(wù)有兩種方式,一種是在配置文件中做相關(guān)的事務(wù)規(guī)則聲明,另一種是基于@Transactional 注解的方式。
使用@Transactional的相比傳統(tǒng)的我們需要手動(dòng)開啟事務(wù),然后提交事務(wù)來(lái)說(shuō)。它提供如下方便
根據(jù)你的配置,設(shè)置是否自動(dòng)開啟事務(wù)
自動(dòng)提交事務(wù)或者遇到異常自動(dòng)回滾
聲明式事務(wù)(@Transactional)基本原理如下:
配置文件開啟注解驅(qū)動(dòng),在相關(guān)的類和方法上通過(guò)注解@Transactional標(biāo)識(shí)。
spring 在啟動(dòng)的時(shí)候會(huì)去解析生成相關(guān)的bean,這時(shí)候會(huì)查看擁有相關(guān)注解的類和方法,并且為這些類和方法生成代理,并根據(jù)@Transaction的相關(guān)參數(shù)進(jìn)行相關(guān)配置注入,這樣就在代理中為我們把相關(guān)的事務(wù)處理掉了(開啟正常提交事務(wù),異?;貪L事務(wù))。
真正的數(shù)據(jù)庫(kù)層的事務(wù)提交和回滾是通過(guò)binlog或者redo log實(shí)現(xiàn)的。
2.@Transactional使用注意點(diǎn)
@Transactional注解只能在拋出RuntimeException或者Error時(shí)才會(huì)觸發(fā)事務(wù)的回滾,常見的非RuntimeException是不會(huì)觸發(fā)事務(wù)的回滾的。但是我們平時(shí)做業(yè)務(wù)處理時(shí),需要捕獲異常,所以可以手動(dòng)拋出RuntimeException異?;蛘咛砑觬ollbackFor = Exception.class(也可以指定相應(yīng)異常)
/*
* 捕獲異常時(shí),要想使事務(wù)生效,需要手動(dòng)拋出RuntimeException異?;蛘咛砑觬ollbackFor = Exception.class
*/
@Override
@Transactional
public Long addBook(Book book) {
Long result = null;
try {
result = bookDao.addBook(book);
int i = 1/0;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
return result;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Long addBook(Book book) {
Long result = null;
try {
result = bookDao.addBook(book);
int i = 1/0;
} catch (Exception e) {
e.printStackTrace();
throw e;
}
return result;
}
只有public修飾的方法才會(huì)生效
方法內(nèi)自調(diào)用導(dǎo)致的事務(wù)不生效
如下幾種情況:
/*
* 情況一:都有事務(wù)注解,異常在子方法出現(xiàn),事務(wù)生效
*/
@Override
@Transactional
public Long addBook(Book book) {
Long result = add(book);
return result;
}
@Transactional
public Long add(Book book){
Long result = bookDao.addBook(book);
int i = 1/0;
return result;
}
/*
* 情況二:都有事務(wù)注解,異常在主方法出現(xiàn),事務(wù)生效
*/
@Override
@Transactional
public Long addBook(Book book) {
Long result = add(book);
int i = 1/0;
return result;
}
@Transactional
public Long add(Book book){
Long result = bookDao.addBook(book);
return result;
}
/*
* 情況三:只有主方法有事務(wù)注解,異常在子方法出現(xiàn),事務(wù)生效
*/
@Override
@Transactional
public Long addBook(Book book) {
Long result = add(book);
return result;
}
public Long add(Book book){
Long result = bookDao.addBook(book);
int i = 1/0;
return result;
}
/*
* 情況四:只有主方法有事務(wù)注解,異常在主方法出現(xiàn),事務(wù)生效
*/
@Override
@Transactional
public Long addBook(Book book) {
Long result = add(book);
int i = 1/0;
return result;
}
public Long add(Book book){
Long result = bookDao.addBook(book);
return result;
}
/*
* 情況五:只有子方法有事務(wù)注解,異常在子方法出現(xiàn),事務(wù)不生效
*/
@Override
public Long addBook(Book book) {
Long result = add(book);
return result;
}
@Transactional
public Long add(Book book){
Long result = bookDao.addBook(book);
int i = 1/0;
return result;
}
以上就是Spring事務(wù)的原理是什么,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。