雪花查询已被杀死:";SQL执行已取消";

雪花查询已被杀死:";SQL执行已取消";,sql,talend,snowflake-cloud-data-platform,Sql,Talend,Snowflake Cloud Data Platform,我有一个Talend作业,在一个Snowflake数据库上运行两个并行的数据流。针对表A的update语句导致表B的更新失败,出现以下错误: 正在提交事务“uuid of Transaction”,id为“a-very-long-integer-id”,SQL执行已取消 END_操作的代码如下所示: var cmd = "CALL END_OPERATION(:1,:2,:3,:4,:5,:6,null);"; try { snowflake.e

我有一个Talend作业,在一个Snowflake数据库上运行两个并行的数据流。针对表A的update语句导致表B的更新失败,出现以下错误:

正在提交事务“uuid of Transaction”,id为“a-very-long-integer-id”,SQL执行已取消

END_操作的代码如下所示:

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语句会被杀死。它几乎马上就被杀死了。

这里我们需要查看运行失败SQL命令的同一会话中来自Talend作业的所有SQL语句流,以及来自其他并行作业的所有语句流

从查询历史记录中,我们可以获得会话的SessionID。从Snowflake UI的History部分,我们可以基于SessionID进行搜索。这将列出在此特定会话中运行的所有命令。 我们可以通过对start_date列进行排序,按时间顺序查看所有命令,并尝试观察SQL语句的顺序

您的观点确实是正确的,即TableA上的更新不应影响TableB上的更新,但在查看了两个会话的所有语句之后(我们了解到Talend作业并行运行两个数据流)我们可能会在一个会话中遇到一些SQL语句,它在从另一个会话提交Update命令之前锁定了tableB

这里可以回顾的另一件事是工作流如何管理事务。在该会话中相同的SQL查询列表中,我们需要检查在会话级别设置参数Autocommit的任何语句。如果在会话开始时将Autocommit设置为FALSE,则在提交显式提交之前,会话不会释放任何表锁


由于这里的情况听起来有点不寻常和复杂,我们可能需要更深入地查看两个查询的执行日志,为此,我们可能需要联系Snowflake支持部门。

这给了我一个很好的起点,我将进一步挖掘。我知道Talend在某些情况下会将自动提交设置为false,所以这很可能是罪魁祸首。你已经把它搞定了。Talend在会话中将autocommit设置为false,然后背靠背运行两个update语句,第二个语句被取消。为了解决这个问题,我让每个Talend组件为各自的更新语句创建自己的会话。谢谢您的确认。我很高兴这些指针起了作用。
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;   
    }