0

我正在使用 Teradat 14 .NET 提供程序。我想在单个事务中执行以下 SQL:

delete mydb.mytable;
insert into mydb.mytable select * from mydb.myothertable;

我遇到的这个问题是,虽然删除是即时的,但插入需要几秒钟。如果在删除之后但在插入提交之前(而不是在执行插入之前)发生选择,则不会返回任何行。SELECT因此,在提交事务之前 ,我不希望任何其他语句都可以看到这两个语句的结果。IsolationLevel.Snapshot有一个最符合我想要的描述:

Reduces blocking by storing a version of data that one application can read while another is modifying the same data. Indicates that from one transaction you cannot see changes made in other transactions, even if you requery.

问题是 Teradata 14 似乎不支持这种类型的事务:

The isolation level is not supported by this version of Teradata Database.

我必须做些什么来保持和的结果deleteinsert被其他人看到select在提交事务之前,

编辑

这是我在 dnoeth 回答后使用的代码。我正在使用 Teradata 会话并将所有 SQL 放入单个字符串中,如果在删除之后但在插入完成之前完成选择,则该字符串仍然不返回任何结果。dnoeth,我是按照你的建议做的吗?TdTransaction请注意,因为我bt;et;在 SQL 中做,所以没有对象。

Using con As TdConnection = GetNewConnection()
    Using cmd As TdCommand = con.CreateCommand
        cmd.CommandText = "bt;delete mydb.mytable;insert into mydb.mytable select * from mydb.myview;et;"
        cmd.ExecuteNonQuery()
    End Using
End Using
4

1 回答 1

1

您的会话是在 ANSI 还是 Teradata 模式下运行?

如果您需要在事务中同时运行 Delete/Insert,则必须

  • 两者都作为多语句请求 (MSR) 运行,例如都使用单个 SQL 字符串发送(首选)

或者

  • 做一个明确的BT;删除...; 插入...; ET;在 Teradata 会话中

但随后 DELETE 会更慢(这是一个FastPath 删除,因为它是事务中的最后一条语句,因此不需要创建 Transient Journal)。

在 Delete/Insert 之间提交 Select 的可能性很低,如果您必须避免它,还有另一种称为 view-switching 的解决方案:

必须使用视图 x 对表进行选择,并且您需要创建表、tab1 和 tab2 的副本。

  • 插入tab2;

  • 将视图 x 替换为 select * from tab2

  • 从 tab1 中删除(或将数据保留为一种备份)

下一次:

  • 插入tab1

  • 将视图 x 替换为 select * from tab1

  • 从 tab2 中删除

等等...

替换之前的所有选择将访问旧版本,然后替换有一个短锁,所有新选择访问新数据。

于 2014-07-24T20:31:01.653 回答