Spring框架下编写事物回滚小记

使用事物前,数据库的表引擎必须要支持事物,比如使用InnoDB


Spring可以对事物进行自动维护,大致可以通过配置bean 过滤器和直接代码标签来控制.


列如:

<!-- 注册jdbc事物管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<tx:annotation-driven transaction-manager="transactionManager"
		proxy-target-class="true" />

@Transactional //这里必须用在公用方法前,也可写在公用类前
	public Map<String,Object> saveNewUserTest(Map<String, Object> p) {
 //doing
 //代码中最好手动抛出runtime异常,使用try catch捕获异常后一定要再抛出异常
}

以上就可以基本实现事物的回滚了.


但是,在一些环境下spring封装会出现兼容性问题,表现为无论怎么使用都无法回滚.

遇到这种情况,我的解决办法是直接使用jdbc来手动实现回滚


关键代码:

                        Connection con =null
	                PreparedStatement ps=null;
			con =DataSourceUtils.getConnection(getDataSource());
			con.setAutoCommit(false);
			try {
		        ps=con.prepareStatement(sql1);
		        ps.executeUpdate();
		        ps=con.prepareStatement(sql2);
		        ps.executeUpdate();
		        ps=con.prepareStatement(sql3);
		        ps.executeUpdate();
		        
		        con.commit();
			} catch (Exception e) {
				con.rollback();
			}finally
			{
				con.setAutoCommit(true);
			}
			DataSourceUtils.releaseConnection(con, getDataSource());

这样就可以实现了


PS(java开发的环境真是恶心的东西)


猜你喜欢

转载自blog.csdn.net/icemaker88/article/details/49902361