Transactions Teradata 14中的哪个事务隔离级别与IsolationLevel.Snapshot密切匹配?
我正在使用Teradat 14.NET提供程序。我希望在单个事务中执行以下SQL: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语句可以看到这两条语句的结果隔离级别。快照的描述最符合我的要求: 通
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;[……]et正如您所建议的,但是如果在语句完成时执行select,我仍然会看到一个空表,这实际上是非常常见的。insert
最多需要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中可以获得的最好结果,因为您绝对需要避免用户在插入过程中进行选择。