一个事务中多个db的外键问题

时间:2011-01-31 10:26:14

标签: sql-server-2008 transactions

我有一个数据库说DB1,在DB1上的一个表(DB1.t1)中添加一个列,在另一个DB2中触发并创建同一行中同一行的副本(DB2.t1)。使用插入行的标识我需要在DB2中的另一个表(DB2.t2)中添加一些行。

问题是,我需要在一个事务中插入DB1.t1和DB2.t2。尝试这样做时,DB1.t1插入正常,但由于它没有提交,DB2.t1不包含该行,因此DB2.t2无法插入新行(缺少外键),仍然发送来自应用程序的数据时正常。

一个选项是提交DB1事务,然后做DB2操作,但还有其他相关的功能。请建议实现它的最佳方法。

2 个答案:

答案 0 :(得分:3)

好吧,Id列没有意义的“密钥”,它们会让你到处绊倒。它们应该是毫无意义的,物理标识符,并且你已经附加了它们的含义。当您要求在另一个数据库中存在相同的Ids时。

您是否解决了FK违规问题?在DB2中,很可能你对DB1行有一个完全不同的Id;当然还有不同的父Ids

您需要始终指定Id值,并让服务器填写,或始终指定Id值,在两个数据库中。

第二个问题是你不是在交易中蠢货。多数据库事务完全没有问题。因此,忘记Id列,它包含的内容,并在两个Dbs中使用表的实际键。 ids会有所不同,但是谁在乎(这意味着需要将意义附加到无意义的标识符上)。

答案 1 :(得分:0)

在存储过程中的一个事务中完成所有操作。查看如何在线进行图书交易。如果错误,请确保放入回滚(使用try catch块)。也可以使用OUTPUT子句或Scope_identity()获取table1中的标识。