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開發的環境真是噁心的東西)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章