4

要在 Subsonic 中使用事务构造(如下),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. 如果未启用,我如何确保在我的应用程序安装过程中启用它?
4

4 回答 4

7

MSDTC 应该随 Windows 一起安装。如果不是,可以使用以下命令安装:

msdtc -install

您可以使用 sc.exe 配置 MSDTC 服务。设置服务自动启动并启动服务:

sc config msdtc start= auto
sc start msdtc

请注意,您需要管理员权限才能执行上述操作。

于 2009-12-02T07:06:36.440 回答
2

我用:

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;
}
于 2011-03-24T22:18:53.527 回答
1

这可能会有所帮助:

http://www.thereforesystems.com/turn-on-msdtc-windows-7/

于 2010-10-04T04:34:35.610 回答
0

如果您的 DBMS 是 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(当然这取决于提供者的实现),而是选择不需要 MSTDC 的底层数据提供者的事务机制(在本例中为 SqlTransaction)。

于 2010-10-11T18:49:21.663 回答