【问题标题】:Use transaction in node-oracledb在 node-oracledb 中使用事务
【发布时间】:2019-10-14 20:20:40
【问题描述】:

我需要在一个事务中执行 3 个不同的更新语句。我正在使用 node-oracle 包。有没有例子说明如何进行交易?

【问题讨论】:

    标签: database oracle node-oracledb


    【解决方案1】:

    最初您可以将autoCommit设置为false,一旦您的任务完成,您就可以提交它。

    通过使用连接函数connection.commit(function(error))

    例子:

    var oracledb = require('oracledb');
    oracledb.autoCommit = false;
    

    并且当 connection.execute() 成功执行时,您可以如下提交它

    conn.execute(
        "INSERT INTO test VALUES (:id, :nm)",
        [2, 'Alison'],  // Bind values
        function(err, result) {
          if (err) {
            return cb(err, conn);
          } else {
            console.log("Rows inserted: " + result.rowsAffected);  // 1
            conn.commit((error)=> { 
               console.log('Error : ', error);
            });
          }
        });
    

    【讨论】:

    • 但这仅适用于一种情况。
    • 所有更新语句都需要顺序执行还是并行执行?
    • 按顺序需要。
    • 为此,您可以创建类似层次结构的结构,您可以在第一个执行语句的结果回调中执行第二个更新语句,在第二个更新语句结果回调中执行第三个更新语句,在第三个更新语句结果中执行你可以提交交易。
    • 您的示例实际上在顶部设置了 autocommit true - 这可能是一个错字,因为您的描述说将其设置为 false。但是,由于默认值为 false,您可以不设置它您想要做的是在最后一次插入之前设置 autocommit true。这将节省显式 commit() 的往返。
    【解决方案2】:

    examples in the node-oracledb GitHub repo。这些示例已更新为使用 Node.js 8 的 async/await 样式,使其更易于理解和正确(但不要忘记使用 await)。另请阅读manual

    您想要的示例是insert1.js,它显示了形成一个事务的 3 个语句。前两个语句不提交,但最后一个使用 autoCommit(这节省了显式 commit() 的成本):

    result = await connection.execute(
      `INSERT INTO test VALUES (:id, :nm)`,
      { id : {val: 1 }, nm : {val: 'Chris'} });
    
    result = await connection.execute(
      `INSERT INTO test VALUES (:id, :nm)`,
      [2, 'Alison']);
    
    result = await connection.execute(
      `UPDATE test SET name = :nm`,
      ['Bambi'],
      { autoCommit: true });  // commit once for all DML in the script
    

    【讨论】:

      猜你喜欢
      • 2015-11-06
      • 2018-04-23
      • 2018-10-25
      • 2016-10-27
      • 2021-10-11
      • 2021-09-18
      • 1970-01-01
      • 2019-08-30
      • 2019-04-22
      相关资源
      最近更新 更多