測試一下MyBatis、Hibernate、Jdbc在事務下同時使用的測試
阿新 • • 發佈:2019-01-07
前言:本專案MyBatis和Hibernate公用同一個DataSource物件,而Jdbc用另外一個新建的DataSource物件。
一、測試Mybatis、Hibernate、Jdbc都是更新同一張表
/** * 事務級別為REQUIRED */ @Override public void test() throws Exception { schoolMapper.updateSchool();//mybatis執行sql語句:"update td_school set id= '2'" schoolManager.saveCommonData("update td_school set name= '3'");//hibernate執行sql語句 Connection connection = dataSource.getConnection(); JdbcUtils.executeUpdate(connection, "update td_school set code = '4'", new ArrayList<Object>());//jdbc執行sql語句 }
由於上面Mybatis、Hibernate、Jdbc都是更新td_school表,所以會報錯:Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction,大概說這張表表被鎖了。
二、測試Mybatis、Hibernate都是更新同一張表,而Jdbc更新另一張表
/** * 事務級別為REQUIRED */ @Override public void test() throws Exception { schoolMapper.updateSchool();//mybatis執行sql語句:"update td_school set id= '2'" schoolManager.saveCommonData("update td_school set name= '3'");//hibernate執行sql語句 Connection connection = dataSource.getConnection(); JdbcUtils.executeUpdate(connection, "update td_test set code = '4'", new ArrayList<Object>());//jdbc執行sql語句 }
上面的三條sql都更新成功
三、測試回滾,jdbc要手動回滾,mybatis和hibernate拋異常就回滾了
/** * 事務級別為REQUIRED */ @Override public void test() throws Exception { schoolMapper.updateSchool();//mybatis執行sql語句:"update td_school set id= '2'" schoolManager.saveCommonData("update td_school set name= '3'");//hibernate執行sql語句 Connection connection = dataSource.getConnection(); JdbcUtils.beginTransaction(connection); JdbcUtils.executeUpdate(connection, "update td_test set code = '4'", new ArrayList<Object>());//jdbc執行sql語句 if (true) {//測試回滾,jdbc要手動回滾,mybatis和hibernate拋異常就回滾了 if (connection != null) { try { JdbcUtils.rollback(connection); } catch (Exception e) { e.printStackTrace(); }finally { if(connection!=null){ JdbcUtils.close(connection); } } } throw new Exception(); } JdbcUtils.commit(connection); if(connection!=null){ JdbcUtils.close(connection); } }
回滾成功,三條sql都沒有執行