Spring中注解事务方面的问题

我们可以在spring的配置文件beans.xml中对事务进行注解配置,这样在相应的类中就不用对事务进行管事,对于某个类,想单独交给spring来管理,那么就在相应的类上加入@Transactional来标记事务。

在默认情况下spring对于运行时的异常RuntimeException,是会进行回滚操作,如果在相应的方法上面加入@Transactional(noRollbackFor =RuntimeException.class),表示对于出现RuntimeException这样的异常不进行回滚,就可以改变spring默认事务的行为,而不对事务进行回滚。

spring对于Exception异常,默认是不会回滚的,如果相让Spring来改变这种默认的行为,那么可以在相应的方法上面加入@Transactional(rollbackFor=Exception.class)设置成回滚,从而改变默认的行为。

Spring的几种注解事务传播行为

Required:业务方法需要在一个事务中运行。如果方法运行时,已经在一个事务中,那么加入到该事务,否则自己创建一个新的事务。一般spring默认都是这种事务,像保存,删除,修改等都是这种事务。80%的情况下都用这种事务。

Not_Supported:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会执行。

Requiresnew:属性不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先事务才会恢复执行。

Mandatory:该属性指定业务方法必须在一个事务中运行,业务方法不能发起自己的事略。如果业务方法在没有事务的环境下调用,容器会抛出例外。

Supports:这一事务属性表明,如果方法在某个事务范围内被调用,则方法成为该事务的一部分。如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行。

Never:指定业务方法绝对不能在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行。

上面的事略在ejb中都会存在。只有下面的事务才是spring自己提供的。

Nested:如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按Required属性执行,它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响,它只对DataSourceTransactionManager事务管理器起效。

Java代码  

    1. Connection conn = null;
    2. try {
    3. conn.setAutoCommit(false);
    4. Statement stmt = conn.createStatement();
    5. stmt.executeUpdate("update person set name=‘888‘ where id=1");
    6. Savepoint savepoint = conn.setSavepoint();//外部事务会设置一个保存点。
    7. //---------------------------------------在内部事略中出现错误,是不会影响外部事务的运行.同种外部事务如果出错,也不会影响内部事务的执行.这就是NESTED事务.我们通过@Resource注入的事务就是这种形式的事务
    8. try{
    9. conn.createStatement().executeUpdate("update person set name=‘222‘ where sid=2");
    10. }catch(Exception ex){
    11. conn.rollback(savepoint);
    12. }
    13. //---------------------------------------
    14. stmt.executeUpdate("delete from person where id=9");
    15. conn.commit();
    16. stmt.close();
    17. } catch (Exception e) {
    18. conn.rollback();
    19. }finally{
    20. try {
    21. if(null!=conn && !conn.isClosed()) conn.close();
    22. } catch (SQLException e) { e.printStackTrace(); }
    23. }
    24. }

Spring中注解事务方面的问题

时间: 2024-11-05 22:43:18

Spring中注解事务方面的问题的相关文章

关于Spring 中的事务

Spring中配置事务的方式有两种:xml配置事务,注解式事务 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Spring中的事务与数据库中的锁关系

本文只先简单的介绍下Spring中的事务与DB中锁的关系. 首先总结:Spring事务的实现本质上是使用的DB中的事务,而DB中的事务实现又主要依靠DB中的锁.所以spring事务本质上使用数据库锁,开启spring事务意味着使用数据库锁. 所以大家一定要厘清DB事务与DB各种锁的原理与概念.后续我也研究一下DB锁,并结合具体的生产环境监控数据来谈谈. <以下是转载部分内容.主要是Spring事务的使用方式.隔离级别之类的> 那么事务的隔离级别与锁有什么关系呢?本人认为事务的隔离级别是通过锁的

Spring中的事务传播行为

Spring在TransactionDefinition接口中定义了7种类型的事务传播行为,它们规定了事务方法是如何传播的. PROPAGATION_REQUIRED(最常用!):支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择. PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行. PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常. PROPAGATION_REQUIRES_NEW:新建事务,如果当

Spring @Cacheable注解 &amp;&amp; 事务@Transactional 在同一个类中的方法调用不生效

@Cacheable 注解在对象内部调用不会生效 代码示例:ProductServiceImpl.java public List<ProductInfoVO> getProductList(CommonRequest<ProductInfoDTO> reqest) { // @Cacheable失效,不会走缓存的 return this.findProductInfoList(reqest); } @Cacheable(cacheNames = "productInfo

Spring中@Transactional事务回滚实例及源码

一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除某个部门的时候,假设我们默认删除对应的成员.但是在执行的时候可能会出现这种情况,我们先删除部门,再删除成员,但是部门删除成功了,删除成员的时候出异常了.这时候我们希望如果成员删除失败了,之前删除的部门也取消删除.这种场景就可以使用@Transactional事物回滚. 二.checked异常和unc

Spring中@Transactional事务回滚(含实例详细讲解,附源码)

原文出处: 小宝鸽 一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除某个部门的时候,假设我们默认删除对应的成员.但是在执行的时候可能会出现这种情况,我们先删除部门,再删除成员,但是部门删除成功了,删除成员的时候出异常了.这时候我们希望如果成员删除失败了,之前删除的部门也取消删除.这种场景就可以使用@Transactional事物回滚. 二.che

Spring中的事务

Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource. TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为 SessionFactory,TransactionManager的实现为HibernateTransactionManager. 一.事务的

Spring中的事务管理

一.Spring事务管理用到的三个接口 a. PlatformTransactionManager 事务管理器 b. TransactionDefinition 事务定义信息(隔离.传播.超时.只读) c. TransactionStatus 事务具体的运行状态 二.Spring为不同的持久化框架提供了不同的PlatformTransactionManager接口实现 事务 说明 org.springframework.jdbc.datasource.DataSourceTransactionM

Spring 之注解事务 @Transactional

众所周知的ACID属性:  原子性(atomicity).一致性(consistency).隔离性(isolation)以及持久性(durability).我们无法控制一致性.原子性以及持久性,但可以控制超时,设置事务的只读性以指定隔离级别.  Spring在TransactionDefinition接口封装了所有这些设置. Spring在TransactionDefinition接口中规定了7种类型的事务传播行为, 它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播: 事务传播行为类型