Hi Henrik,
I spawned another discussion since this issue is not related to the
one described in the other thread we used to talk in. I downloaded
from the GIT the latest source of transactions and ATM and I was
playing around with it. I found a problem in the implementation of the
ChildTransaction that would always cause a rollback of the entire
scope. The _CanCommit remains false throughout its lifecycle, making
the IsRollbackOnlySet property on base to always return true for a
transaction of this type.
I have created a new test that would trap this problem but it could
require some changes in the test project. First of all, I don't see
any point in stubing the transaction manager in the ATM tests,
basically hiding this type of problems. So I changed the
MockTransactionManager to derive from the DefaultTransactionManager
and, with a couple of event hookings from the constructor, to expose
the same kind of information as the old one (so you don't need to
change the tests).
private void SetupStatistics()
{
base.TransactionCreated += (sender, ev) => { _transactions+
+;};
base.ChildTransactionCreated += (sender, ev) =>
{ _transactions++; };
base.TransactionCompleted += (sender, ev) =>
{ _committedCount++; };
base.TransactionRolledBack += (sender, ev) =>
{ _rolledBackCount++; };
}
After this change, the following test would trap this kind of problem:
[Test]
public void TestChildTransactions()
{
WindsorContainer container = new WindsorContainer();
container.AddFacility("transactionmanagement", new
TransactionFacility());
container.AddComponent("transactionmanager",
typeof(ITransactionManager), typeof(MockTransactionManager));
container.AddComponent("mycomp", typeof(CustomerService));
container.AddComponent("delegatecomp", typeof
(ProxyService));
ProxyService serv =
(ProxyService)container.Resolve("delegatecomp");
serv.DelegateInsert("John","Home Address");
MockTransactionManager transactionManager =
(MockTransactionManager)
container["transactionmanager"];
Assert.AreEqual(2, transactionManager.TransactionCount);
Assert.AreEqual(0, transactionManager.RolledBackCount);
}
The test class I used has the following form:
[Transactional]
public class ProxyService
{
private readonly CustomerService customerService;
public ProxyService(CustomerService customerService)
{
this.customerService = customerService;
}
[Transaction(TransactionMode.Requires)]
public virtual void DelegateInsert(string name, string
address)
{
this.customerService.Insert(name, address);
}
}
--
You received this message because you are subscribed to the Google Groups
"Castle Project Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/castle-project-users?hl=en.