Spring事务5种属性

1、事务传播行为

propagation

① REQUIRED(默认)

② REQUIRES_NEW

2、事务隔离级别

isolation

① Isolation.READ_UNCOMMITTED(会出现脏读,不可重复读,幻读 ,避免了 第一类丢失 更新)

Isolation.READ_COMMITTED(会出现不可重复读,幻读)

③ Isolation.REPEATABLE_READ(会出现幻读)

④ Isolation.SERIALIZABLE

⑤ DEFAULT(默认,采用数据库默认隔离级别)

3、事务回滚属性(针对异常属性,值均为数组{})

noRollbackFor = {UserAccountException.class}

noRollbackForClassName(类全限定名)

rollbackFor

rollbackForClassName

4、事务只读属性

readOnly = false/true

5、事务超时属性

timeout = 3 //单位s

6、代码说明

package com.lty.tx;

import java.util.concurrent.TimeUnit;

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
	private BookShopDao bookShopDao;

	//添加事务注解
	//1、使用propagation指定事务的传播行为,即当前的事务方法被另外一个事务方法调用时
	//如何使用事务,默认取值为REQUIRED,即使用调用方法的事务
	//REQUIRES_NEW:使用自己的事务,调用事务方法的事务被挂起
	//2、使用isolation指定事务的隔离级别,最常用的取值为Isolation.READ_COMMITED
	//3、默认情况下Spring的声明式事务对所有的运行时异常均进行回滚,也可以通过对应的属性
	//进行设置,通常情况下取默认值即可
	//4、使用readOnly指定事务是否为只读,表示该事务只读取数据但不更新数据,
	//这样可以 帮助数据库引擎优化事务(若确实是只读取数据库值的方法,应设置readOnly=true)
	//5、使用timeout指定强制回滚事务之前事务可以占用的时间,以提高响应速度
	@Transactional(propagation = Propagation.REQUIRES_NEW,
			isolation = Isolation.READ_COMMITTED,
//			noRollbackFor = {UserAccountException.class}
			readOnly = false,
			timeout = 3 //单位s
			)
	@Override
	public void purchase(String username, String isbn) {
		try {
			TimeUnit.SECONDS.sleep(5);
		} catch (InterruptedException e) {
			
		}
		
		//1、获取书的单价
		int price = bookShopDao.findBookPriceByIsbn(isbn);
		
		//2、更新书的库存
		bookShopDao.updateBookStock(isbn);
		
		//3、更新用户余额
		bookShopDao.updateUserAccount(username, price);
	}

}

 

注意的几点

1、@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能。

 

2、默认情况下,一个有事务方法, 遇到RuntiomeException 时会回滚 .  遇到 受检查的异常 是不会回滚 的. 要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) 。

 

参考资料

1、Spring transaction 事务 --Isolation & Progation

转载于:https://my.oschina.net/Howard2016/blog/1553636

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值