使用事物前,數據庫的表引擎必須要支持事物,比如使用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開發的環境真是噁心的東西)