使用事物前,数据库的表引擎必须要支持事物,比如使用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开发的环境真是恶心的东西)