1. 程式人生 > >測試一下MyBatis、Hibernate、Jdbc在事務下同時使用的測試

測試一下MyBatis、Hibernate、Jdbc在事務下同時使用的測試

前言:本專案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都沒有執行