Oh, it most certainly is.It execute that on the prepare phase.
That is expected. The problem is _why_ it is doing this.
Because the connection is open in the start phase.

On Sun, Mar 22, 2009 at 2:09 PM, Matthijs ter Woord <
[email protected]> wrote:

>
> 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.
> >
> >
>

Reply via email to