2015-02-04 5 views
3

В 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 

ответ

1

на стороне сервера транзакций являются более эффективными. Подумайте об этом так. Если вы начинаете транзакцию на стороне клиента, тогда сервер должен знать, что транзакция выполняется для фиксации или откат. Это также приводит к большей связи между клиентским приложением и сервером базы данных.

0

Я крупный сторонник транзакций на стороне клиента, если они выполнены правильно.

Когда вы выполняете транзакцию на стороне клиента, все, что вы действительно делаете, открывает соединение и отправляет «BEGIN TRAN». Отсюда, когда вы передаете объект транзакции вокруг разных классов и выполняете обновления, вы просто используете это открытое соединение. По этой причине я не полностью согласен с ответом Грегга, потому что вы используете открытое соединение с открытой транзакцией, поэтому сервер всегда «знает».

Предполагая, что он правильно окружен в Try/finally, чтобы закрыть его, а также «используя» блок, они довольно конкретны. После 10 лет успешного использования их у меня никогда не было проблем с блокировкой.

Я обычно использую фреймворк, который содержит в себе несколько дочерних классов ... например, подумайте о «клиентском» объекте с набором телефонных номеров и адресов внутри него, каждый из которых имеет свои собственные процедуры обновления для каждого элемента.

Если я должен был выполнить обновление родительского элемента, было бы очень сложно отменить изменения, используя транзакции на стороне сервера, поскольку все обновления аккуратно упорядочены в свои собственные обновления sprocs для каждой таблицы/объекта.

Передача транзакции на стороне клиента и вызов хранимых процедур внутри этой транзакции дает мне возможность чисто откатить, когда какое-либо исключение выдается и фиксируется, как только мы знаем, что обновление завершено.

Клиентская сторона Сделки - это подарок от самого большого человека, когда вы используете их правильно.