事务的属性:
1.使用propagation指定事务的的传播行为,即当前的事务方法被另一个事务方法
调用时如何使用事务,默认取值为REQUIRED,即使用调用方法的事务
REQUIRES_NEW使用自己的事务 调用的事务方法的事务被挂起
2.使用isolation指定事务的隔离级别,最常用的取值为READ_COMMITTED
3.默认情况下Spring的声明式事务对所有的运行时异常进行回滚,也可通过对应的
属性进行设置为readOnly=true
5.使用timeout指定强制回滚之前事务可以占用的时间
1.BookShopServiceImpl实现类
“`
package com.spring.tx;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Service(“bookShopService”)
public class BookShopServiceImpl implements BookShopService {
@Autowired
public BookShopDao bookShopDao;
/*添加事务注解
* 1.使用propagation指定事务的的传播行为,即当前的事务方法被另一个事务方法调用时
* 如何使用事务,默认取值为REQUIRED,即使用调用方法的事务
* REQUIRES_NEW使用自己的事务 调用的事务方法的事务被挂起
* 2.使用isolation指定事务的隔离级别,最常用的取值为READ_COMMITTED
* 3.默认情况下Spring的声明式事务对所有的运行时异常进行回滚,也可通过对应的属性进行设置
* 4.使用readOnly指定事务是否为可读,表示这个事务只读数据但不更新数据
* 应设置为readOnly=true
* 5.使用timeout指定强制回滚之前事务可以占用的时间
* @Transactional(propagation=Propagation.REQUIRES_NEW,
isolation=Isolation.READ_COMMITTED,
noRollbackFor= {UserAccountException.class},
readOnly=false,
timeout=3)
*/
@Transactional(propagation=Propagation.REQUIRES_NEW,
isolation=Isolation.READ_COMMITTED)
@Override
public void purchase(String username, String isbn) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//1.获取书的单价
int price=bookShopDao.findBookPriceByIsbn(isbn);
//2.更新书的库存
bookShopDao.updateBookStock(isbn);
//3.更新用户余额
bookShopDao.updateUserAccount(username, price);
}
}
““