This exception happens whenever you try to use a transaction (distributed transaction in this case) which has already been completed. I think NHibernate is too late in executing the Delete statement.
On Sun, Mar 22, 2009 at 6:57 PM, Ayende Rahien <[email protected]> wrote: > Hm, another problem that I run into, and I am not sure what the problem is: > > public void CanDeleteItemInDtc() > > { > > object id; > > using (var tx = new TransactionScope()) > > using (var s = sessions.OpenSession()) > > { > > id = s.Save(new Person > > { > > CreatedAt = DateTime.Today > > }); > > new ForceEscalationToDistributedTx(); > > > > tx.Complete(); > > } > > using (var tx = new TransactionScope()) > > using (var s = sessions.OpenSession()) > > { > > new ForceEscalationToDistributedTx(); > > > > s.Delete(s.Get<Person>(id)); > > tx.Complete(); > > } > > } > > This is failing with a System.Data.SqlClient.SqlException: Distributed > transaction completed. Either enlist this session in a new transaction or > the NULL transaction. > > On Sun, Mar 22, 2009 at 9:55 AM, Ayende Rahien <[email protected]> wrote: >> >> Correction, the DTC infrastructure will report the transaction failure >> back on TX dispose. >> Sweat, so my solution looks good enough to push for production. >> >> On Sun, Mar 22, 2009 at 9:52 AM, Ayende Rahien <[email protected]> wrote: >>> >>> Just run into this issue. >>> >>> What would you expect this to do? >>> >>> [Test] >>> >>> public void WillNotCrashOnDtcPrepareFailure() >>> >>> { >>> >>> using(var tx = new TransactionScope()) >>> >>> { >>> >>> using (var s = sessions.OpenSession()) >>> >>> { >>> >>> s.Save(new Person >>> >>> { >>> >>> CreatedAt = DateTime.MinValue // will cause SQL date >>> failure >>> >>> }); >>> >>> } >>> >>> new ForceEscalationToDistributedTx(); >>> >>> tx.Complete(); >>> >>> } >>> >>> } >>> >>> The problem is that when we fully escalate to distributed tx, the actual >>> commit is going to happen on a different thread. >>> If an exception is thrown by the commit, this is going to crash the >>> entire process. >>> Now, my problem is that I am not sure what NH's behavior should be in >>> this regard, because we don't have a good way of reporting the error to the >>> user at this point. >>> I am going to commit a fix that will swallow the exception, force a >>> rollback on the DTC and log an error. >>> I am not _happy_ about that, but I can't think of anything that will be >>> better. > >
