是否必须在 C# 中使用带有 using 关键字的 sqltransaction

Is it necesserly to use sqltransaction with using keyword in C#

我有两个使用块:

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 中那样声明交易?

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

您要求安全,这可能与资源或数据库数据的观点有关。

using语句

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

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

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

SQL事务

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

您可以直接在 your SQL code or declared in your .net code using a SQLTransaction 中进行数据库事务:

在您的 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.");
}