Spring中事務的傳播行爲

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 點擊打開鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章