2009-11-19 3 views
3

Чтобы использовать транзакционную конструкцию (как указано ниже) в Subsonic, MSDTC должен быть запущен на компьютере под управлением Windows. Правильно?Понимание MSDTC в Windows

 using (TransactionScope ts = new TransactionScope()) 
     { 
      using (SharedDbConnectionScope sharedConnectionScope = new SharedDbConnectionScope()) 
      { 
       // update table 1 
       // update table 2 

       // ts.commit here 

      } 
     } 
  1. Является ли MS-DTC службы по умолчанию в системах Windows (XP, Vista, Windows 7, серверы и т.д.)?
  2. Если он не включен, как я могу убедиться, что он включен во время процесса установки моего приложения?

ответ

7

MSDTC должен быть установлен с окнами. Если это не может быть установлен с помощью следующей команды:

msdtc -install 

Вы можете настроить службу MSDTC с помощью sc.exe. Установите сервис для запуска автоматически и запустите услугу:

sc config msdtc start= auto 
sc start msdtc 

Обратите внимание, что для выполнения вышеуказанных действий вам понадобятся права администратора.

0

Если СУБД SQL Server 2000 и вы используете TransactionScope распределенная транзакция создается даже для локальной транзакции. Однако SQL Server 2005 (и, вероятно, SQL Server 2008) достаточно умен, чтобы понять, что распределенная транзакция не нужна. Я не знаю, применимо ли это только к локальным БД или даже истинно, если вы используете транзакцию только с одной БД, даже если она находится на удаленном сервере. http://davidhayden.com/blog/dave/archive/2005/12/09/2615.aspx

Один подсказку, вы можете использовать пакетный запрос, чтобы избежать TransactionScope.

http://subsonicproject.com/docs/BatchQuery

BatchQuery, QueueForTransaction и ExecuteTransaction не будет использовать TransactionScope (разумеется, что зависит от реализации поставщика), но выбрать транзакцию mechanismn базового поставщика данных (SqlTransaction в данном случае), который не потребует MSTDC.

1

Я использую:

private bool InitMsdtc() 
{ 
    System.ServiceProcess.ServiceController control = new System.ServiceProcess.ServiceController("MSDTC"); 
    if (control.Status == System.ServiceProcess.ServiceControllerStatus.Stopped) 
     control.Start(); 
    else if (control.Status == System.ServiceProcess.ServiceControllerStatus.Paused) 
     control.Continue(); 
    return true; 
}