分類  >  資料庫 >

方法中既有hibernate又有jdbc,加了@Transactional但事物回滾錯誤

tags:    時間:2014-05-04 12:35:10
方法中既有hibernate又有jdbc,加了@Transactional但事物回滾異常

寫介面的時候,如果是資料庫模式,經常會需要從對方資料庫中直接提取數據,然後稍做處理,插入wms資料庫,此時,一般就會在manager中既用到hibernate又用到jdbc,偽代碼如下:其中介面getErpCompanyRowData方法是加了@Transactional的。

 

/**處理單條客戶信息*/

1 public void getErpCompanyRowData(ResultSet rs, PreparedStatement ps, Connection erp_con) throws SQLException {

2        ErpCompany ec = EntityFactory.getEntity(ErpCompany.class);

3        ec.setDownId(rs.getLong("downid"));

4        ec.setType(rs.getString("type"));

5        ec.setCompanyId(rs.getLong("companyid"));

6        ………可能很多set

7        commonDao.store(ec);

8

9       String sql = "update WMS_TRANSFERS_D_COMPANY set tranflag=1, downtime=? where downid=?";

10        ps = erp_con.prepareStatement(sql);

11        ps.setTimestamp(1, Timestamp.valueOf(DateUtil.getDateTime()));

12        ps.setObject(2, ec.getDownId(), Types.BIGINT);

13        ps.executeUpdate(); 

14        erp_con.commit();

15}

 

此時,如果第9行的sql執行異常,可能的結果就是wms保存了ErpCompany,但是erp的表記錄沒有更新成功,出現事務不一致,既然加了@Transactional,為什麼會出現這種情況?

 

原來,Spring配置的@Transactional只有碰到運行時異常RuntimeException才會回滾,這個方法拋出的是SQLExceptionSQLException沒有繼承RuntimeException,所以Spring的事務提交了,但是jdbc的事務失敗了,造成事務不一致。

如何解決?在介面中配置@Transactional(rollbackFor=Exception.class),讓Spring遇到Exception就回滾,這樣即可保證事務一致

推薦閱讀文章

Bookmark the permalink ,來源:互聯網