雪花存储过程事务行为不可预测



我使用snowflake已经有一段时间了,但实际上还没有处理涉及事务的存储过程,我需要使用流,其中一种情况是涉及一些业务逻辑,这些逻辑将通过条件事务回滚放入sp中。我已经编写了一个这样的过程,但到目前为止,回滚还没有取得任何成功。

以下是我试图实现的伪代码:

CREATE OR REPLACE PROCEDURE TEST_SP(STREAM_NAME varchar,RECORD_ID_KEY varchar)
RETURNS VARCHAR
LANGUAGE javascript
AS
$$
var source_table_row1 = `SELECT RECORD_CONTENT::string from ${STREAM_NAME} limit 1;`;
var statement1 = snowflake.createStatement({sqlText:source_table_row1});
var raw_json='';
try
{
var result_set1=statement1.execute();
while (result_set1.next()) 
{
raw_json = result_set1.getColumnValue(1);
}
} catch(err)
{
var result =  "Failed: Code: " + err.code + "n  State: " + err.state;
result += "n  Message: " + err.message;
return "detailed error  is:"+result; 
}
snowflake.execute({sqlText:"begin transaction"});
if(raw_json)
{
try
{

//run DDL & DML statmetents  
var result_set2=snowflake.createStatement({sqlText:"DDL STMT"}).execute();
var rs=snowflake.createStatement({sqlText: "DML STMT"}).execute();
var rs2=snowflake.createStatement({sqlText: "FINAL DML STMT"}).execute();

}catch(err){
snowflake.execute ({sqlText: "rollback"});
var errorMessage= "Failed: Code: " + err.code + "n  State: " + err.state;
errorMessage += "n  Message: " + err.message+"    with net_status="+net_status;
return errorMessage;
}
}
else
{
snowflake.execute({sqlText: "rollback"});
return "no data present in source table";

}
snowflake.execute({sqlText:"rollback"});
return "successfully completed "

$$;

这里的问题是,如果一切顺利,我可以看到sp执行所需的操作,但对于查询失败的情况(例如,尝试复制不存在的表单表(,代码进入catch块,存储过程完成,但我看不到任何回滚活动因此而发生。有人能告诉我这里缺了什么吗。谢谢

问题是事务内部的DDL代码:

snowflake.execute({sqlText:"begin transaction"});
...
//run DDL & DML statmetents  
var result_set2=snowflake.createStatement({sqlText:"DDL STMT"}).execute();  -- here
var rs=snowflake.createStatement({sqlText: "DML STMT"}).execute();       
var rs2=snowflake.createStatement({sqlText: "FINAL DML STMT"}).execute();
...
snowflake.execute ({sqlText: "rollback"});

交易

显式事务应仅包含DML语句和查询语句。DDL语句隐式提交活动事务(有关详细信息,请参阅DDL部分(

DDL

每个DDL语句都作为一个单独的事务执行。

如果在事务处于活动状态时执行DDL语句,则DDL语句:

  • 隐式提交活动事务。

  • 将DDL语句作为单独的事务执行。

因为DDL语句是它自己的事务,所以不能回滚DDL语句;包含DDL的事务在您可以执行显式ROLLBACK之前完成

最新更新