事务的传播行为

  • 当一个事务方法,调用另一个事务方法时,必须制定事务必须如何传播。

Spring 定义了 7 种类传播行为

  • REQUIREED
  • REQUIRES_NEW

需求
一个人要买多本书。。。

interface cashier{
/* * */
	checkout(String username , List<String > isbns);
}

Test_ springTransaction

使用 propagation 指定事务的传播行为,即当前的书屋方法被另外一个事务方法调用时
如何使用事务,默认取值为 required ,即使用调用方法的事务 。

REQUIRED

REQUIRES_NEW

Cashier

package vedio.service.imp;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import vedio.service.BookShopService;
import vedio.service.Cashier;

@Service("cashier")
public class CashierImp implements Cashier{
	
	@Autowired
	BookShopService bookShopService  ; 

	/** * */
	@Transactional
	@Override
	public void checkout(String username, List<String> isbns) {
		for (String isbn : isbns) {
			bookShopService.purchaseBook(username, isbn);
		}
	}

}

BookShop

package vedio.service.imp;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import vedio.dao.BookShopDao;
import vedio.service.BookShopService;

@Service
public class BookShopServiceImp implements BookShopService {

	@Autowired
	private BookShopDao bookShopDao ; 
	
	/** * 添加事务注解 * 使用 propagation 指定事务的传播行为,即当前的事务方法被另外一个事务方法调用时, * 如何使用事务, * REQUIRED (默认取值) , 即使用调用方法的事务 * REQUIRES_NEW ,必须启动一个新事务,并在自己的事务内运行, * 如果有事务在运行,就应该先挂起它 */
	@Transactional(propagation = Propagation.REQUIRED) 
	@Override
	public void purchaseBook(String username, String isbn) {
		//1. 书单价
		int price = bookShopDao.findBookPriceByIsbn(isbn);
		
		//2.书库存-1
		bookShopDao.updateBookStockDownByIsbn(isbn);
		
		//3. 用户余额-price
		bookShopDao.updateUserAccount(username, price);
		
	}

	

}