3

我正在尝试做最简单的事情并将事务应用于该CreatePortal方法。

如果我正在使用TransactionScope- 它出于某种未知原因升级为 DTC - 不好。

using (var ts = new TransactionScope())
{
    var portalController = new PortalController();

    var portalId =
        portalController.CreatePortal(
                    "TESTTESTTEST",
                    string.Empty,
                    string.Empty,
                    "TESTTESTTEST_" + new Random().Next(999999),
                    UserController.GeneratePassword(),
                    "TESTTESTTEST_" + new Random().Next(999999) + "@something.com",
                    string.Empty,
                    string.Empty,
                    Globals.ApplicationMapPath + "/Portals/_default/",
                    "Default Website.template",
                    "Portals/TESTTEST",
                    "TESTTESTTEST",
                    string.Empty,
                    string.Empty,
                    false);

    ts.Complete();
}

如果我在最后使用DataProvider.Instance().GetTransaction并执行RollbackTransaction- 它不会回滚,这意味着事务甚至没有工作。

var t = Data.DataProvider.Instance().GetTransaction();

var portalController = new PortalController();

var portalId =
    portalController.CreatePortal(
                "TESTTESTTEST",
                string.Empty,
                string.Empty,
                "TESTTESTTEST_" + new Random().Next(999999),
                UserController.GeneratePassword(),
                "TESTTESTTEST_" + new Random().Next(999999) + "@something.com",
                string.Empty,
                string.Empty,
                Globals.ApplicationMapPath + "/Portals/_default/",
                "Default Website.template",
                "Portals/TESTTEST",
                "TESTTESTTEST",
                string.Empty,
                string.Empty,
                false);

Data.DataProvider.Instance().RollbackTransaction(t);

那么,如何在 DotNetNuke 中使用事务?

4

2 回答 2

1

当您通过该GetTransaction方法创建事务时,DataProvider只会创建一个新连接并为您提供事务。然后,您需要手动使用该事务来执行您将对数据库采取的任何操作。没有办法传递该事务,以便它被例如CreatePortal或任何其他内置 DNN 函数使用。该功能似乎仅适用于您可能进行的任何其他数据库访问。

至于如何在事务中包装来自 DNN 核心的调用,我认为你不能。我知道推荐的最干净的解决方案(不幸的是,仍然不是很干净)是使用事务手动调用存储过程,而不是通过控制器类。

What's your use case, maybe I can recommend a solution that solves the problem some other way...

于 2009-09-25T20:19:02.140 回答
1

I was able to use Transactions in DNN with the help of this article.

It doesn't apply to your case, but will help others trying to leverage transactions in DNN.

于 2011-08-17T21:56:04.413 回答