事务的目的就是要保证数据的高度完整性和一致性。
在实际的项目中,大多都是使用注解的方式来实现事物,这里也就简单记录下使用@Transactional
方法和注意事项.
在xml中添加配置
1
|
<!-- TransactionManager -->
|
使用
在接口或类的声明处 ,写一个@Transactional
如:
1
|
// 业务方法需要在一个事物中运行,如果方法运行时,已经存在一个事物中,
|
参数说明
readOnly: 该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true),要想只读生效,必须启动一个事务。而恰恰我们只是读取时,根本不需要事物,所以这个标识有点无意义.
rollbackFor: 该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:
指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)
指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
rollbackForClassName: 该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:
指定单一异常类名称:@Transactional(rollbackForClassName=”RuntimeException”)
指定多个异常类名称:@Transactional(rollbackForClassName={“RuntimeException”,”Exception”})
noRollbackFor: 该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:
指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)
指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})
noRollbackForClassName: 该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:
指定单一异常类名称:@Transactional(noRollbackForClassName=”RuntimeException”)
指定多个异常类名称:
@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”}) propagation:该属性用于设置事务的传播行为,例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
isolation: 该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置
timeout: 该属性用于设置事务的超时秒数,默认值为-1表示永不超时
注意
在一个方法中,我们需要统计商品每天的销量并保存和更新商品的总销量,如:
1
|
@Transactional
|
假设我们在执行更新updateProductSalesStat();
方法时出现了异常DataIntegrityViolationException
,结果就是每日商品销量信息保存成功,而更新商品总销量没有成功,说明事物没有达到我们想要的结果,回滚保存每日销量。
解决办法想到了两个:
1.使用rollbackFor 参数,指定要回滚的异常:@Transactional(rollbackFor = Exception.class)
2.抛出运行时异常,即:
1
|
try {
|
原文:http://www.cnblogs.com/admol/p/5101729.html