sql-server - 客户端与服务器端数据库事务

标签 sql-server transactions

SQL Server事务可以在客户端或服务器代码中执行。一位数据库专家曾告诉我,由于锁定问题,应该避免客户端事务。现在,几年后,我想知道这是否仍然适用。

当然,有些场景需要客户端事务,但让我们假设可以使用客户端或服务器端事务解决特定问题。

在性能方面,这两种技术中哪一种最好?为什么?

C#(客户端):

using (var transaction = new TransactionScope())
{
    // Insert data into database.

    transaction.Complete();
}

T-SQL(服务器):
CREATE PROCEDURE [dbo].[my_proc]
AS
BEGIN
    SET NOCOUNT ON

    DECLARE @TransactionCount [int]

    BEGIN TRY
        SET @TransactionCount = @@TRANCOUNT

        IF @TransactionCount = 0
            BEGIN TRANSACTION

        -- Insert data

        IF @TransactionCount = 0
            COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        IF XACT_STATE() <> 0 AND @TransactionCount = 0 
            ROLLBACK TRANSACTION

        ; THROW
    END CATCH
END
GO

最佳答案

服务器端事务更高效。这么想吧。如果您在客户端启动事务,则服务器必须知道事务正在进行中才能提交或回滚。这也会导致客户端应用程序和数据库服务器之间进行更多的通信。

关于sql-server - 客户端与服务器端数据库事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28330777/

相关文章:

c# - 如何避免在 SQL Server 中将 HTML 实体转换为 html 形式 CAST(@ContentXml AS XML)

c# - Entity Framework 6查询时上下文重复

sql - 在 Hive SQL 中引用计算列的输出

java - 在同一函数内多次调用数据库时关闭 JDBC 连接

java - 通过持久性连接到mssql而不复制dll

sql-server - SQL Server 拒绝表中除一名用户之外的所有用户

google-app-engine - GAE Go - 如何处理 ErrConcurrentTransaction 数据存储事务错误

java - TransactionEventHandler 在 Node.setProperty() 上给出 javax.transaction.SystemException

mysql - 使用 LOCK TABLES 回滚事务

database - 从两个表中读取时的完整性 : orders and order_items