spring 声明式事务管理在真实的Service和单元测试时的回滚情况,需要注意的问题,jpa为例子

如何测试事务,测试事务回滚情况:

我做了大量的不同的测试:


场景1:   

Service层中使用注解@Transactional,注解@PersistenceContext     private EntityManager  emt;

写了两个方法

     

public	void insertfail()                //插入失败要回滚
{
	
	for(int i=0;i<20;i++)
	{
		User users=new User();
		users.setEmail("sds@qq.com"+i);
		if(i==10)
		{
			int a=1/0;
		}
		this.emt.persist(users);
		
	}
}


public	void insertsuccess()             //正常插入
{
	
	for(int i=0;i<20;i++)
	{
		User users=new User();
		users.setEmail("sds@qq.com"+i);
		
		this.emt.persist(users);
		
	}
}


使用spring-test,junit4进行单元测试

单元测试中不带   @Transactional   和@TransactionConfiguration(defaultRollback=false),然后使用注解激活Service ,写两个测试方法,就是直接调用service的方法

@Autowired
private uservice usv;

	@Test
	public void testshiwu_fail(){
	
	this.usv.insertfail();

	}
	
	@Test
	public void testshiwu_success(){
	
	this.usv.insertsuccess();

	}

最后测试结果:

成功的:
Hibernate: 
    insert 
    into
        User
        (changetime, email, password, registtime, username) 
    values
        (?, ?, ?, ?, ?)
11:48:43.960 [main] DEBUG o.s.orm.jpa.JpaTransactionManager - Initiating transaction commit
11:48:43.960 [main] DEBUG o.s.orm.jpa.JpaTransactionManager - Committing JPA transaction on EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@6d214a1e]
11:48:44.038 [main] DEBUG o.s.orm.jpa.JpaTransactionManager - Closing JPA EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@6d214a1e] after transaction
11:48:44.038 [main] DEBUG o.s.o.jpa.EntityManagerFactoryUtils - Closing JPA EntityManager

要回滚的:因为出现除以0的错误所以回滚:
Hibernate: 
    insert 
    into
        User
        (changetime, email, password, registtime, username) 
    values
        (?, ?, ?, ?, ?)
11:50:55.662 [main] DEBUG o.s.orm.jpa.JpaTransactionManager - Initiating transaction rollback
11:50:55.662 [main] DEBUG o.s.orm.jpa.JpaTransactionManager - Rolling back JPA transaction on EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@62bb0f89]
11:50:56.416 [main] DEBUG o.s.orm.jpa.JpaTransactionManager - Closing JPA EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@62bb0f89] after transaction
11:50:56.416 [main] DEBUG o.s.o.jpa.EntityManagerFactoryUtils - Closing JPA EntityManager


这就完结了吗?当然没有:场景一是一个常见的服务层的事务测试。如果我们正确插入,则真的插进数据库了;如果我们运行出现错误,那就回滚了。这是显而易见的。现在我要说的是

场景二:正确插入数据时,也回滚数据,但是我们获取到已经插入的信息,这可以保护数据现场。

@TransactionConfiguration(defaultRollback=true)

第一种:不保护数据现场

Service层代码不变,test中的测试代码也不便,但是在test中加入  @Transactional        @TransactionConfiguration(defaultRollback=false)           //开启事务,并不回滚

测试结果是:

正确插入的方法:
Hibernate: 
    insert 
    into
        User
        (changetime, email, password, registtime, username) 
    values
        (?, ?, ?, ?, ?)
11:59:52.169 [main] DEBUG o.s.orm.jpa.JpaTransactionManager -
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring声明式事务管理包括以下几个步骤:1. 在 Spring 配置文件中配置事务管理器;2. 使用 @Transactional 注解将需要事务管理的方法标注;3. 调用该方法,Spring 将自动开启事务并在事务结束自动提交或回滚事务。 ### 回答2: Spring声明式事务管理使用步骤如下: 1. 配置数据源:首先需要配置数据源,用于连接数据库。可以使用Spring提供的内置数据源或者自定义数据源。 2. 配置事务管理器:使用SpringTransactionManager来配置事务管理器,可根据需要选择不同的事务管理器,如DataSourceTransactionManager、JpaTransactionManager等。 3. 配置事务切入点:通过使用Spring提供的AspectJ表达式或者自定义切入点选择需要应用事务管理的方法。 4. 配置事务通知:使用SpringTransactionInterceptor类来配置事务通知。可以在方法执行前、执行后或者执行出现异常应用事务管理。 5. 配置AOP代理:通过使用Spring的AOP配置,将事务通知织入到需要应用事务管理的方法中。 6. 测试事务管理:在应用中调用需要应用事务的方法,并验证事务是否正确管理。 以上就是使用Spring声明式事务管理的步骤。通过配置数据源、事务管理器、事务切入点和事务通知来实现事务管理,并使用AOP代理将事务通知织入到方法中。最后可以进行测试,验证事务是否正确管理。使用Spring声明式事务管理可以大大简化事务管理的工作,并提高代码的可维护性和可重用性。 ### 回答3: Spring声明式事务管理使用步骤如下: 1. 配置数据源:首先,在Spring的配置文件中配置数据库的连接信息,包括数据库驱动类、连接URL、用户名和密码等。 2. 配置事务管理器:在配置文件中配置事务管理器,Spring提供了多种事务管理器的实现,如基于JDBC的DataSourceTransactionManager、基于JTA的JtaTransactionManager等,选择合适的事务管理器并配置。 3. 配置事务通知:使用Spring的事务通知功能,将需要事务管理的方法或者类标注上相应的注解,如@Transactional。这些被注解的方法或者类,在运行会被Spring框架拦截并自动应用事务管理。 4. 配置事务属性:在注解中可以指定事务的传播行为、隔离级别、超间等属性,根据具体的业务需求进行配置。 5. 配置异常回滚策略:通过捕获和处理特定的异常,可以控制事务的回滚行为。可以使用注解中的rollbackFor属性指定需要回滚的异常类型。 6. 运行和测试:完成以上配置后,可以运行和测试应用程序。在方法调用,被事务管理的方法将会受到事务拦截和控制。如果出现异常或者满足回滚条件,事务将会回滚,否则事务将会提交。 需要注意的是,Spring声明式事务管理是基于AOP实现的,在运行使用代理对象对方法进行增强。配置声明式事务管理的步骤可以在Spring的配置文件中进行,也可以使用注解进行配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值