事务的传播行为
- 当一个事务方法,调用另一个事务方法时,必须制定事务必须如何传播。
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);
}
}