Как запрограммировать распределенную транзакцию?

В прошлом все мои потребности в БД решались sqlite. Теперь, разрабатывая базу данных, которая потенциально может быть большой, я изучил «Распределенную транзакцию». Как мне это запрограммировать? Я нашел некоторые результаты, объясняющие, что такое распределенная транзакция, но не объясняющие, как ее программировать.

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


person Community    schedule 12.12.2009    source источник


Ответы (2)


Введение в концепцию см. в Википедии.

Для использования в .NET просмотрите пространство имен System.Transactions, особенно класс TransactionScope. Это позволит вам подключиться к использованию DTC. Если вы посмотрите на проект System.Data.SQLite, то увидите, как они интегрировали DTC с SQLite.

person jason    schedule 12.12.2009
comment
Вы говорите, что я могу написать тест распределенной транзакции прямо сейчас с помощью sqlite? Если да, то я вполне могу это сделать. - person ; 12.12.2009
comment
Насколько я знаю, System.Data.SQLite поддерживает автоматическую регистрацию DTC. Так да. - person jason; 12.12.2009

Описанный вами подход может привести к проблемам с производительностью. Для каждого запроса требуется транзакция с участием нескольких баз данных. Это дорого. Распределенные транзакции могут быть хорошим решением, если вам нужно, например, включить вызов веб-службы и запрос БД в одну транзакцию.

Если вам будет нужна масштабируемость для повышения производительности при больших нагрузках в будущем, вы можете рассмотреть возможность кластеризации. Вместо того, чтобы распределять части одного варианта использования между разными серверами, вы будете выполнять простые (не распределенные) транзакции. И вы получите выгоду от масштабируемости, потому что разные запросы будут обрабатываться разными серверами.

Существуют разные мнения об основной цели кластеризации и ее применимости в различных ситуациях. Я думаю, что это зависит от домена и требует тщательного анализа. Некоторые ссылки по кластеризации: кластеризация баз данных, Нил Макаллистер, Обзор кластеризации баз данных SQL Server 2000 с использованием MSCS (устарело), ​​Кластеризация (вычисления) из Википедии и Алгоритмы кластеризации — для общих знаний.

Я бы порекомендовал вам взглянуть на Ошибочные архитектуры Мартина Фаулера (в основном речь идет о распределенных вычислениях). , но также применимо и к транзакциям), Обзор распределенных транзакций из MSDN, и эти два мнения:

Действительно ли дистрибутив настолько плох? и (О) Первый закон распределения Мартина Фаулера.

person Roman Boiko    schedule 12.12.2009
comment
Это не ответ на ваш вопрос, но я надеюсь, что это будет полезно и убережет вас от серьезных ошибок. - person Roman Boiko; 12.12.2009
comment
Благодаря анонимному голосующему, я обнаружил, что мой первоначальный ответ содержал неправильную ссылку. Сейчас отредактировал и добавил больше информации. - person Roman Boiko; 12.12.2009
comment
Предупреждение: я предоставил разные ссылки, чтобы дать общую информацию с разных точек зрения. Если вы решите использовать кластеризацию, я уверен, вы найдете более конкретную информацию о том, как лучше всего это сделать в вашей ситуации. - person Roman Boiko; 12.12.2009