【问题标题】:Is it necesserly to use sqltransaction with using keyword in C#是否必须在 C# 中使用带有 using 关键字的 sqltransaction
【发布时间】:2021-07-14 11:13:19
【问题描述】:

我有两个 using 块:

using (SqlConnection connection = new SqlConnection(_connectionString))
{
    String query = "query...";
    using (SqlCommand command = new SqlCommand(query, connection))
    {
        command.Parameters.AddWithValue("@param", "paramValue");

        connection.Open();
        int result = command.ExecuteNonQuery();

        // Check Error
        if (result < 0)
            Console.WriteLine("Error inserting data into Database!");
    }
}

是否足以使此查询安全,还是需要像this post 那样声明事务?

【问题讨论】:

  • “是否足以使这个查询安全” - 那么,查询做什么?如果它是单行的简单insert,那么它已经具有一定的原子性——尽管对例如隔离级别的细粒度控制需要更多工作(如果需要);如果它有多个步骤,它可能需要一个事务,取决于您的环境和要求以及查询,我们都不知道
  • 您的查询可能不是问题,虽然我们没有查询,但您应该使用Parameters.AddCan we stop using AddWithValue() already?It's Evil.
  • 我认为您将安全性(您创建的必要对象是否会正确处理)和关于数据库级别原子性的安全性混为一谈。您必须出示您的查询,以便我们知道您是否应该使用交易。
  • @Stuart 确实,这就是我添加替代答案的原因

标签: c# sql-server sqltransaction


【解决方案1】:

您要求安全,这可能与资源角度或数据库数据角度相关。

using 语句

using statement 是释放非托管资源的try-catch-finally 语句的语法糖。

请注意,这与您的数据库代码无关,它仅处理IDisposable 对象,在您的代码中为SQLConnectionSQLCommand

您可以选择不编写 using 语句,但它非常有用,我建议您使用 using 语句...不仅适用于数据库连接,还适用于其他非托管资源。

SQLTransaction

如果有多个操作,并且您希望确保它们以原子方式运行(全部完成或没有任何更改),则需要数据库事务。

您可以直接在your SQL code 中拥有数据库事务,或者使用SQLTransaction 在您的.net 代码中声明:

在您的 SQL 代码中:

BEGIN TRANS myTrans
Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description');
Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description');
COMMIT TRANS myTrans

或在 .NET 中声明:

try
{
    command.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
    command.ExecuteNonQuery();
    command.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
    command.ExecuteNonQuery();

    // Attempt to commit the transaction.
    transaction.Commit();
    Console.WriteLine("Both records are written to database.");
}

【讨论】:

    【解决方案2】:

    单个操作不需要事务,因为单个操作会创建隐式事务。当您处理应该被视为“原子”的多个操作时,事务是有意义的,即,如果一个操作失败,您可以回滚所有更改(事务还有更多用途,但我尽量保持简单)

    【讨论】:

    • ... 即使你做了几个原子查询,你也不需要使用using。你也可以使用“try/catch/finally”。
    • @Fildor 或两者兼而有之;交易可以说是catch 用于显式中止的情况,但仍应处理它,IMO 最好使用using
    • @MarcGravell 当然。很公平。我只想说“你并不总是必须”。不过,这样做确实很有意义。
    • 我认为这个答案缺乏解决 using 语句对数据库数据没有任何作用,它只确保正确处理连接......我添加了我自己的答案。跨度>
    猜你喜欢
    • 1970-01-01
    • 2020-11-07
    • 2022-01-13
    • 2014-09-11
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 2020-03-04
    • 2010-12-18
    相关资源
    最近更新 更多