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