2009-11-19 4 views
3

Pour utiliser la construction de transaction (comme suit) dans Subsonic, MSDTC doit être exécuté sur la machine Windows. Droite?Présentation de MSDTC dans Windows

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

       // ts.commit here 

      } 
     } 
  1. est MS-DTC Un service par défaut sur les systèmes Windows (XP, Vista, Windows 7, Serveurs, etc.)?
  2. Si elle n'est pas activée, comment puis-je m'assurer qu'elle est activée pendant le processus d'installation de mon application?

Répondre

7

MSDTC doit être installé avec Windows. Si elle ne peut être installé avec la commande suivante:

msdtc -install 

Vous pouvez configurer le service MSDTC en utilisant sc.exe. Définissez le service pour démarrer automatiquement et démarrer le service:

sc config msdtc start= auto 
sc start msdtc 

Notez que vous aurez besoin du privilège d'administrateur pour effectuer ce qui précède.

0

Si votre SGBD est SQL Server 2000 et que vous utilisez un TransactionScope une transaction distribuée est créée même pour des transactions locales. Toutefois, SQL Server 2005 (et probablement SQL Server 2008) sont assez intelligents pour comprendre qu'une transaction distribuée n'est pas nécessaire. Je ne sais pas si cela s'applique uniquement aux bases de données locales ou même si la Transaction n'implique qu'une seule base de données même si elle se trouve sur un serveur de suppression. http://davidhayden.com/blog/dave/archive/2005/12/09/2615.aspx

Une indication, vous pouvez utiliser une requête par lots pour éviter le TransactionScope.

http://subsonicproject.com/docs/BatchQuery

BatchQuery, QueueForTransaction et ExecuteTransaction ne pas utiliser un TransactionScope (bien sûr qui dépend de la mise en œuvre du fournisseur), mais choisir le mechanismn de transaction du fournisseur de données sous-jacentes (SqlTransaction dans ce cas) qui ne nécessitera pas MSTDC.

1

J'utilise:

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; 
} 
Questions connexes