雪花查询已终止:“sql执行已取消”

kzmpq1sx  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(357)

我有一个talend作业,在一个snowflake数据库上运行两个并行的数据流。针对表a的update语句导致表b的更新失败,错误如下:
正在提交事务“uuid of transaction”,id“a-very-long-integer-id”,sql执行已取消。

Call END_OPERATION(999,'String1','String2','String3','String4','Success','0')

UPDATE TableB SET BATCH_KEY =  1234, LOAD_DT = current_timestamp::timestamp_ntz, KEY_HASH = MD5(TO_VARCHAR(ARRAY_CONSTRUCT(col1))), ROW_HASH = MD5(TO_VARCHAR(ARRAY_CONSTRUCT(col2, col3))) WHERE BATCH_KEY = -1 OR BATCH_KEY IS NULL;

结束操作的代码如下:

var cmd = 
 "CALL END_OPERATION(:1,:2,:3,:4,:5,:6,null);";
    try {

    snowflake.execute (
        {sqlText: cmd,binds: [BATCH_KEY,ENTITY,LAYER,SRC,OPERATION,OPERATION_STATUS].map(function(param){return param === undefined ? null : param})},
        );
    return "Succeeded.";  

    }
catch (err)  {
    return "Failed: " + err;   
    }

var cmd = 
 "UPDATE TableA SET OPERATION_STATUS=:6,END_DT=current_timestamp,ROW_COUNT=IFNULL(:7,ROW_COUNT) WHERE BATCH_KEY=:1 AND ENTITY_NAME=:2 AND LAYER_NAME=:3 AND SRC=:4 AND OPERATION_NAME=:5";
    try {

    snowflake.execute (
        {sqlText: cmd,binds: [BATCH_KEY,ENTITY,LAYER,SRC,OPERATION,OPERATION_STATUS,ROW_COUNT].map(function(param){return param === undefined ? null : param})},
        );
    return "Succeeded.";  

    }
catch (err)  {
    return "Failed: " + err;   
    }

我不明白为什么针对tableb的update语句会被杀死。它马上就要被杀死了。

ki0zmccv

ki0zmccv1#

在这里,我们需要检查运行失败sql命令的同一会话中来自talend作业的所有sql语句的流,以及来自另一个并行作业的所有语句的流。
从查询历史中我们可以得到会话的sessionid。从snowflake ui的history部分,我们可以基于sessionid进行搜索。这将列出此特定会话中运行的所有命令。我们可以通过对start\u date列进行排序,按时间顺序查看所有命令,并尝试观察sql语句的顺序。
您的观点确实是正确的,即对tablea的更新不应影响对tableb的更新,但在查看两个会话的所有语句(我们了解到talend作业并行运行两个数据流)之后,我们可能会在一个会话中遇到一些sql语句,它在提交update命令之前锁定了tableb在另一次会议上反对它。
这里可以回顾的另一件事是工作流如何管理事务。在该会话中的同一个sql查询列表中,我们需要检查在会话级别设置参数autocommit的任何语句。如果在会话开始时将autocommit设置为false,则在提交显式提交之前,会话不会释放任何表锁。
由于这里的情况听起来有点不寻常和复杂,我们可能需要更深入地挖掘,以查看这两个查询的执行日志,为此,我们可能需要联系snowflake支持部门。

相关问题