gpt4 book ai didi

c# - DbTransaction.Commit 回滚,导致代码中断?

转载 作者:搜寻专家 更新时间:2023-10-30 22:03:24 24 4
gpt4 key购买 nike

所以我有一组复杂的代码(由其他人编写),其中有一个函数可以在最终 Commit()ing 更改之前执行大量数据库操作。

问题是,代码中有一些子函数被调用,例如 getThis 或 getThat,它们具有 execute() 和 queryDatabase() 函数。代码在某些情况下(并非所有情况下)不断导致错误,它会在此“执行”或“queryDatabase”处卡住。本质上,我认为这与代码在提交更改之前需要来自这些 queryDatabase 命令的数据这一事实有关。

在删除传递给这些子函数的 dataAccess 指针后(因此它们不是提交的一部分),代码突然成功通过。

使用 Commit() 的正确方法是什么,或者我应该摆脱它而不使用这些交易功能?让代码立即执行所有操作?

我什至找不到最后一个错误,只是另一个模糊的“连接参数 null”SystemArgumentNullException,它以某种方式连接到它是一个事务。

System.ArgumentNullException: Value cannot be null
Parameter name: connection
at Data.Database.PrepareCommand(DbCommand command, DbConnection connection)

很难发布代码,因为它跨越至少 20 个不同的文件(是的,原始开发人员不知道 KISS)。

最佳答案

事务提交后 Transaction.Connection 将设置为 null,如果代码将 Transaction.Connection 作为对所有子函数的引用传递,这可能是连接设置为 null 的原因。事务不拥有连接,因此不应将其传递给其他子函数。

听起来连接正在到处传递。更好的方法是将连接放在 using block 中,并且只将需要该连接的命令和与之关联的事务放在 using block 中。

这是一个基本模式:

using(DbConnection connection = ...)

{

connection.Open();

using(DbTransaction transaction = connection.BeginTransaction(...))

{

... do stuff ...

transaction.Commit();

} // transaction rolled back here if an Exception is thrown before the call to Commit()

} // connection closed here

如果代码保存到多个表/记录,则事务是必需的。工作单元需要作为一个整体而不是部分地提交。摆脱事务的一种方法是让数据库通过存储过程直接管理它们。 BEGIN TRAN 在存储过程中显式完成,此时 C# 代码不再管理它。

另请查看 System.Transactions 命名空间。我认为它比在连接本身上管理事务更容易使用。

关于c# - DbTransaction.Commit 回滚,导致代码中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7097411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com