hibernate事务回滚

1.拦截服务

aop面向切面

	<aop:config>
		<aop:pointcut id="productServiceMethods"
			expression="execution( public * com.jyd.bms.service.*.*(..))" />
			                               
		<aop:advisor advice-ref="txAdvice" pointcut-ref="productServiceMethods" />

	</aop:config>

2.事务规则

我只拦截了add*方法的事务:

<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="find*" read-only="true" />
			<tx:method name="get*" read-only="true" />
			<tx:method name="add*" propagation="REQUIRED" read-only="false"
				rollback-for="java.lang.RuntimeException" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="delete*" propagation="REQUIRED" />
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="test*" propagation="REQUIRED" />
			<tx:method name="*Transaction" propagation="REQUIRED" />
		</tx:attributes>
	</tx:advice>

3.保证事务一致性

public void addTest() throws DeleteException, DataNotFoundException, CreateException {
		testDAO.delete(testDAO.getById(1));
		Test test = new Test();
		test.setDate(new Date());
		testDAO.add(test);// 2
}

方法名是add*可以被事务拦截到,而且抛出异常让事务回滚,事务的回滚一定得是运行异常。编译类型异常不能产生回滚。

testDAO.delete(testDAO.getById(1));

这里是删除一个序号为1的test,并且新增一个test,但是新增的时候会报错,因为我的test还有一个字段的值是不能为空的。

如下图所示:test字段是不能为空,我只给Date字段赋值,所以新增的时候肯定会产生创建失败异常(CreateException)。

4.实验结果

永远也删除不掉序号为1的test,因为新增产生异常,必然会回滚数据。

This entry was posted in java写网站. Bookmark the permalink.

发表评论

电子邮件地址不会被公开。 必填项已用*标注