我正在开发一个SSIS包,它必须查询(执行SP)一个Generations的源数据库,然后将这些Generations插入目标数据库。
为此,我需要进行一些检查:源数据库中的生成是否已存在于目标数据库中?如果没有,只需插入即可。如果它确实存在,它是否自上次插入后更新(aka:LastModified与DestinationDB中的同一代不同)?如果没有,那就留下吧。如果是,请更新目标数据库中的生成。
我面临的问题与相关数据有关。不仅必须插入Generation,而且每个相关项目也必须插入Destination的表格中(例如Equipment,Packs,...)。
由于目标数据库是只读数据库,因此可以通过删除生成(级联到其他表)轻松完成,然后再次插入生成。一切都很好。
现在,下一步是在此工作流程中包含事务(当我删除某些内容时,我必须插入新数据。如果失败,则需要回滚所有内容)。我已将包的隔离级别设置为Serializable,并将TransactionOption设置为Required。 DestinationConnection将RetainSameConnection设置为True。
每当我尝试使用之前运行的相同数据调试我的包时,都会收到以下错误消息:
为保留的指定了不兼容的事务上下文 连接。这种联系是在不同的情况下建立的 交易背景。保留的连接可以完全使用 一个交易背景。
在我看来,这是因为我尝试删除所有数据,然后将其重新插入同一个事务中。 SSIS可能想要使用不同的连接(RetainSameConnection设置为False解决了问题),但这不是我的想法,除非一个连接失败使得另一个连接也回滚(但我读过这不是这种情况) ...)。
任何人都可以帮助我指出正确的方向吗?任何帮助表示赞赏。
谢谢!
答案 0 :(得分:1)
这一切都归结为将我的连接的RetainSameConnection属性设置为false。我想我需要所有这些都在同一个连接上运行,但显然,事实并非如此。即使没有组件在同一个连接上不断运行,回滚似乎也能正常工作。
Grtz