Spring中事務的傳播行爲
一、說在前面
1、當事務方法被另一個事務方法調用時,必須指定事務應該如何傳播。例如:方法可能繼續在現有事務中運行,也可能開啓一個新事務,並在自己的事務中運行。2、事務的傳播行爲可以由傳播屬性指定。Spring 定義了 7 種類傳播行爲:
(1)REQUIRED:如果有事務在運行,當前的方法就在這個事務內運行,否則,就啓動一個新的事務,並在自己的事務裏運行。
(2)REQUIRES_NEW:當前的方法必須啓動新事務,並在它自己的事務裏運行;如果有事務正在運行,應該將它掛起。
(3)MANDATORY:當前的方法必須運行在事務內部,如果沒有正在運行的事務,就拋出異常。
(4)NESTED:如果有事務在運行,當前的方法就應該在這個事務的嵌套事務裏運行,否則,就啓動一個新的事務,並在它自己的事務裏運行。
(5)NEVER:當前的方法不應該運行在事務中,如果有運行的事務,就拋出異常。
(6)NOT_SUPPORTED:當前的方法不應該運行在事務中,如果有運行的事務,就將它掛起。
(7)SUPPORTS:如果有事務在運行,當前的方法就在這個事務內運行,否則,它可以不運行在事務中。
二、實例代碼如下:
本實例是在上一篇文章Spring中聲明式事務管理的例子的基礎上進行的,重複代碼不在贅述,請翻閱上一篇文章。
1、Cashier接口
package com.at.spring.tx;
import java.util.List;
public interface Cashier {
public void checkout(String username,List<String> isbns);
}
2、CashierImpl實現類package com.at.spring.tx;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service("cashier")
public class CashierImpl implements Cashier{
@Autowired
private BookShopService bookShopService;
@Transactional
public void checkout(String username, List<String> isbns) {
for(String isbn:isbns){
bookShopService.purchase(username, isbn);
}
}
}
3、BookShopService接口package com.at.spring.tx;
public interface BookShopService {
public void purchase(String username,String isbn);
}
4、BookShopServiceImpl實現類package com.at.spring.tx;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Service("bookShopService")
public class BookShopServiceImpl implements BookShopService{
@Autowired
private BookShopDao bookShopDao;
//添加事務註解
/**
* 使用propagation指定事務的傳播行爲,即當前的事務方法被另外一個事務方法調用時如何使用事務,
* 默認的取值爲REQUIRED,即使用被調用方法的事務
* REQUIRES_NEW:使用自己的事務,調用的事務方法的事務被掛起。
*/
@Transactional(propagation=Propagation.REQUIRED)
public void purchase(String username, String isbn) {
//1、獲取書的單價
int price = bookShopDao.findBookPriceByIsbn(isbn);
//2、更新書的庫存
bookShopDao.updateBookStock(isbn);
//3、更新用戶餘額
bookShopDao.updateUserAccount(username, price);
}
}
By luoyepiaoxue2014
微博地址: http://weibo.com/luoyepiaoxue2014 點擊打開鏈接