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