Spring声明式事务管理的一些事

  1. 对于read-only的真实理解:推荐帖子:http://www.iteye.com/topic/319768。read-only靠底层的jdbc驱动和数据库的支持。在大多数数据库系统下,只读事务里面是不可以修改数据,并且,在同一个事务里面同一个sql读出来的同一条记录是不会变化的,这是我们开启readonly最重要的原因:我们需要能够可重复读。 它是性能优化的推荐配置。
  2. 对于没有执行数据库操作的方法,而被Spring进行事务管理,同样会占用数据库资源。所以对于执行时间比较长的方法,比如要进行一些网络请求,最好不要进行事务管理,因为这样会长时间占用数据库连接资源,当并发量大的时候,会造成数据库连接被占尽,而其他请求则一直排队等候。
  3. 业务层中的方法调用抛出异常:  有时Spring出抛出这样的异常Transaction rolled back because it has been marked as rollback-only一般是由于一个server调用另一个server其中一个server抛出异常,虽然另一个server捕获了异常,但是以上异常同样会抛出,因为一个server抛出异常Spring认为拦截此server应该回滚,但是另一个server却捕获了异常不用回滚,但是Spring已经标记了需要回滚,所以会发生此类事情。
  4. 事务的传播属性

        PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 

        PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。 
        PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 
        PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 
        PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

相关推荐