【问题标题】:create another connection in transaction mysql在事务 mysql 中创建另一个连接
【发布时间】:2019-01-02 07:27:06
【问题描述】:

我想知道是否可以在一个事务中创建两个不同的连接,所以假设有这个代码(我在表“employe”中执行创建操作并在表“log”中创建日志):

    try {
        InitialContext initialContext = new InitialContext();
                    DataSource datasource = (DataSource) initialContext.lookup("java:/comp/env/jdbc/postgres");

                    Connection connection_db= datasource.getConnection();
                    PreparateStatement p1 //Preparate statement to put the employe parameter

                    connessione_db.setAutoCommit(false);
                    connessione_db.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
                p1.execute();
                //This create another connect 
                LOGStatic.createLog("CREATE EMPLOYE");             

                connessione_db.commit();
                connessione_db.setAutoCommit(true);
         }catch(....){
                   connection_db.rollback();
        }

这是LOGStatic.createLog("CREATE EMPLOYE");的方法

public static void creaLogException(String messaggio) {
        Connection connection_db= null;

        InitialContext initialContext;
        try {
            initialContext = new InitialContext();
            DataSource datasource = (DataSource) initialContext.lookup("java:/comp/env/jdbc/postgres");

            connection_db= datasource.getConnection();
            // the code continues with the save operation

        } catch (NamingException n) {

        }
        // actual jndi name is "jdbc/postgres"
        catch (SQLException s) {

        }

我的问题是否可能是这种行为并且提交和回滚操作没有问题,或者不可能有另一个连接? 任何人都可以提供帮助

【问题讨论】:

    标签: java jdbc transactions


    【解决方案1】:

    至少在 JDBC 中,事务与Connection 紧密耦合。

    在 Java EE 服务器中,如果您正在编写会话 bean,那么事务将由服务器管理。因此,在这种情况下,您可以调用多个方法,事务将遵循方法调用。

    在 JDBC 中,简单的解决方案是不关闭连接,而是将其作为输入参数传递给不同的方法。

    但是,要非常小心,不关闭连接几乎肯定会导致 OutOfMemoryError。

    (您可以使用 ThreadLocal,而不是将连接作为输入参数传递给各种方法。但如果您不清理 ThreadLocal 变量,这是另一个内存泄漏源。)

    有关事务生命周期和Connection 如何在 JDBC 中绑定的更多信息,请参阅:How to start a transaction in JDBC?

    注意:即使在 JavaEE 中也不能嵌套事务,因为 JTA 不支持嵌套事务。

    传递连接:

    public static void createEmployee(){
        InitialContext initialContext = new InitialContext();
        DataSource datasource = (DataSource) initialContext.lookup("java:/comp/env/jdbc/postgres");
        Connection connection_db= datasource.getConnection();
        try {
            connessione_db.setAutoCommit(false);
            connessione_db.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
    
            PreparateStatement p1 //Preparate statement to put the employe parameter
            p1.execute();
            //This create another connect 
            createLog("CREATE EMPLOYE", connessione_db);             
    
            connessione_db.commit();
            //connessione_db.setAutoCommit(true); //No need
        }catch(....){
            try{ connection_db.rollback(); }catch(Exception e){ /*You can also check some flags to avoid exception*/ }
        }finally{
            try{ connection_db.close(); }catch(Exception e){ /*Safe to ignore*/ }
        }
    }
    
    public static void createLog(String messaggio, Connection connection_db) {
        try {
            // the code continues with the save operation
    
        } catch (SQLException s) {
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      相关资源
      最近更新 更多