Spring学习_05_Spring中事物属性

在前面的“Spring学习_04_Spring和Hibernate整合数据源(DataSource)”一文中,我们没有指定我们事务的属性,现在我们为其加上我们事务的属性。更改我们service的代码如下:

	@Transactional(propagation=Propagation.REQUIRED,readOnly=false)
	public void add(User user) {
		userDAO.save(user);
		addMsg();
	}
	@Transactional(propagation=Propagation.MANDATORY,readOnly=false)
	public void addMsg(){
		Msg msg = new Msg();
		msg.setLog("a user saved!");
		msgDao.save(msg);
	}
这里我们将前面的方法add拆分成了两部分,这样做的用意是测试使用的传播属性(propagation)。

事物的传播属性有以下几个取值(很重要,尤其是REQUIRED。要理解什么事事务的传播特性)(来自于spring文档):

Enum Constant Summary
MANDATORY 
          Support a current transaction, throw an exception if none exists.
NESTED 
          Execute within a nested transaction if a current transaction exists, behave like PROPAGATION_REQUIRED else.
NEVER 
          Execute non-transactionally, throw an exception if a transaction exists.
NOT_SUPPORTED 
          Execute non-transactionally, suspend the current transaction if one exists.
REQUIRED 
          Support a current transaction, create a new one if none exists.
REQUIRES_NEW 
          Create a new transaction, suspend the current transaction if one exists.
SUPPORTS 
          Support a current transaction, execute non-transactionally if none exists.
这里我们在一个方法中取值为REQUIRED(默认值),表明如果调用add方法的时候没有事务就创建一个,如果有事务了就用已经存在的事物,而我们的add方法实在测试方法中调用的,那个时候是不存在事务的,所以此处如果设置为MANDATORY,就会报错。但是我们在add中调用addMsg方法是,由于在add方法中已经存在了一个事务,所以这个时候指定MANDATORY没有任何问题,他会使用已经存在的事务。

另外属性是readonly,如果在这里设置为true,表明在事务所在的方法中只会对数据库做只读操作,凡是涉及到insert,update,delete的方法都不会允许执行。所以上面如果我们在add和addMsg方法中我们设置readonly=true的话,则往数据库中插入数据的时候,就会报错。这个属性完全是spring用来对数据库操作进行优化的,通俗来说就是readonly对应的Connection的效率要比readwrite的Connection的效率要高很多。

isolation:事物的隔离级别,这个和Hibernate中完全一样。

timeout:设置事物的超时时长是多少。

rollbackfor:指出发生那种异常的时候,会造成事务回滚,这个默认是发生RuntimeException。一般事务运行的时候发生运行时异常回滚就是在这里设置的,其他几个属性同样道理,不做细说。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值