Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Transactions Teradata 14中的哪个事务隔离级别与IsolationLevel.Snapshot密切匹配?_Transactions_Teradata_Transaction Isolation - Fatal编程技术网

Transactions Teradata 14中的哪个事务隔离级别与IsolationLevel.Snapshot密切匹配?

Transactions Teradata 14中的哪个事务隔离级别与IsolationLevel.Snapshot密切匹配?,transactions,teradata,transaction-isolation,Transactions,Teradata,Transaction Isolation,我正在使用Teradat 14.NET提供程序。我希望在单个事务中执行以下SQL: delete mydb.mytable; insert into mydb.mytable select * from mydb.myothertable; 我遇到的这个问题是,虽然删除是即时的,但插入需要几秒钟。如果选择发生在删除之后,但在提交插入之前(与执行插入之前相反),则不会返回任何行。因此,在提交事务之前,我不希望任何其他SELECT语句可以看到这两条语句的结果隔离级别。快照的描述最符合我的要求: 通

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

delete mydb.mytable;
insert into mydb.mytable select * from mydb.myothertable;
我遇到的这个问题是,虽然删除是即时的,但插入需要几秒钟。如果选择发生在删除之后,但在提交插入之前(与执行插入之前相反),则不会返回任何行。因此,在提交事务之前,我不希望任何其他
SELECT
语句可以看到这两条语句的结果<代码>隔离级别。快照的描述最符合我的要求:

通过存储一个应用程序在另一个应用程序修改相同数据时可以读取的数据版本来减少阻塞。表示即使您重新查询,也无法从一个事务中看到其他事务中所做的更改。

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

delete mydb.mytable;
insert into mydb.mytable select * from mydb.myothertable;
此版本的Teradata数据库不支持隔离级别。

在提交交易之前,我必须做什么才能使
delete
insert
的结果不被其他
select
语句看到

编辑

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

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

您的会话是否在ANSI或Teradata模式下运行

如果需要在事务中同时运行删除/插入,则必须

  • 以多状态请求(MSR)的形式运行两者,例如,两者都使用单个SQL字符串发送(首选)

  • 做一个明确的BT;删除。。。;插入。。。;ET;在Teradata会话中
但是删除速度会慢一些(以前是FastPath删除,因为它是事务中的最后一条语句,因此不需要创建临时日志)

在删除/插入之间提交选择的概率很低,如果必须避免,还有另一种解决方案称为视图切换:

表上的选择必须使用视图x完成,并且需要创建表的副本tab1和tab2

  • 插入表2中

  • 将视图x替换为从选项卡2中选择*

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

下次:

  • 插入表1

  • 将视图x替换为从选项卡1中选择*

  • 从表2中删除

等等


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

我处于Teradata模式。我试了
bt;[……]etinsert
最多需要6秒钟,因此在此期间至少有一个用户有足够的时间执行选择。我已经考虑过双表方法,但由于管理从哪个表读取所涉及的开销,我决定不使用它。此外,我用我正在使用的代码更新了我的问题,以防对您有所帮助。当您在同一字符串中发送两个Delete/Insert时,您不需要BT/ET。表上的选择使用脏读(锁定行访问)当你能在交易过程中看到任何东西时。为了避免这种情况,您可以使用“LOCK TABLE mydb.mytable EXCLUSIVE delete mydb.mytable;insert into mydb.mytable select*from mydb.myview;”来阻止任何访问。我正在获取
[Teradata Database][3523]当我不尝试删除表时,用户没有对mydb.mytable的删除表访问权。无论如何,该锁是否会导致所有其他选择等待命令完成?如果是这样的话,我已经实现了类似的功能,但是我真的希望允许所有选择都从当前数据中读取,并且在删除和插入完成之前不会看到新数据。我认为快照隔离是我想要的,但Teradata不支持。是的,独占锁阻止任何其他访问,您需要删除表权限才能做到这一点,对不起。当您移除访问锁(即返回Selects和Insert的默认锁)时,您将获得ANSI SERIALIZABLE,这是您在TD中可以获得的最好结果,因为您绝对需要避免用户在插入过程中进行选择。