创建事务范围并创建上下文顺序



这些代码有什么区别:

using (TransactionScope tran = new TransactionScope ())
{
using (Entities ent = new Entities())
{

using (Entities ent = new Entities())
{
using (TransactionScope tran = new TransactionScope ())
{

行顺序重要吗?

谢谢

在这种情况下没关系,因为Entities看起来像模型/数据类,它不能/不需要登记到事务中,所以你可以有任何订单,它不会产生差异。现在,如果在Entities操作中存在任何问题,Read/DML,那么事务也会中止,假设操作发生在环境事务上下文中,尽管类/对象像IDBConnection一样会自动登记到事务中(前提是未设置为 false(,但是即使在事务上下文之外创建连接, 然后不会自动登记,需要显式登记事务上下文

总之

对于您当前的代码,在您处理需要事务登记的对象(如IDBConnection(之前并不重要。在两个代码片段中,虽然我的偏好是第一个,其中环境事务都包含所有需要自动登记的对象,我们不会偶然留下任何对象。

重要区别

您可能希望注意是否要访问事务上下文之外的实体,因为这在选项 1 中是不可能的,但在选项 2 中不会成为问题

是的,顺序很重要。 或者更确切地说,我们不能说不看你的代码就没关系。

DbConnection 实例将在环境事务中建立(如果存在一个环境事务,当它们被打开((时。

您的 DbContext 构造函数可能会打开基础 DbConnection,在这种情况下,这两种模式会有所不同。

第一个是正常模式,你应该坚持这一点。

此外,如果您使用的是 SQL Server,请不要使用 TransactionScope 的默认构造函数。 请参阅使用新的 TransactionScope(( 被认为是有害的