雪花事务中具有多个 DML 的原子性

Posted

技术标签:

【中文标题】雪花事务中具有多个 DML 的原子性【英文标题】:Atomicity with multiple DML's in Snowflake Transactions 【发布时间】:2021-07-02 14:45:57 【问题描述】:

您好,我有一个要求,

BEGIN TRANSACTION NAME <name_identifier of the transaction>;

<insert statement> on table ABC

<delete statement> on table ABC

COMMIT;

现在我想要两个 sql 都应该完成或没有。 任何一条语句都不应该被执行。

我应该如何做到这一点。自从我尝试过。

create or replace table test_table(user_id integer,ip_address text,user_agent text,email text);
create or replace table test_table_copy(user_id integer,ip_address text,user_agent text,email text);

begin transaction name test_transaction;

insert into test_table_copy values(100,'1.1.1.1','ua_1','abc1@gmail.com');

insert into test_table values(100,'1.1.1.1','ua_1','abc1@gmail.com');

-- will fail as table name does not exist
delete from test_tablee where user_id = 100;

commit;

尽管 delete 语句失败,但我仍看到 insert 的行为发生。

我如何在这里实现全部完成或未完成的事情。

谢谢

【问题讨论】:

【参考方案1】:

要中止事务,您可以将:TRANSACTION_ABORT_ON_ERROR 设置为 TRUE。

TRUE:非自动提交事务被中止。在该事务中发出的所有语句都将失败,直到执行提交或回滚语句以关闭该事务。

ALTER SESSION SET TRANSACTION_ABORT_ON_ERROR = TRUE;

【讨论】:

以上是关于雪花事务中具有多个 DML 的原子性的主要内容,如果未能解决你的问题,请参考以下文章

并发编程的原子性 != 事务ACID的原子性

redis的事务不是原子性

事务锁与原子性

Redis 的事务到底是不是原子性的

mysql事务机制

MySQL事务及其实现