That's helpful. I was able to track down the issues I was having in my
code to a service layer method calling another service layer method
instead of calling a dao method.
The other issue I was having was knowing when to call / not call Commit
if there was a parent transaction in progress:
protected virtual void CommitTransaction()
{
// do not commit if parent transaction present ???
IBatisNet.DataMapper.Mapper.Instance().CommitTransaction();
}
When I fixed my original problem, this problem went away too.
--- Gilles Bayon <[EMAIL PROTECTED]> wrote:
> There is a property
>
> SqlMapper.IsSessionStarted
>
> On 8/2/05, Ron Grabowski <[EMAIL PROTECTED]> wrote:
> >
> > Suppose I have the following methods in a service layer class:
> >
> > public bool Update(User user)
> > {
> > IBatisNet.DataMapper.Mapper.Instance().BeginTransaction();
> > try
> > {
> > // do dao related things to Bar
> > int bar = user.Bar;
> > ProcessBar(bar);
> > IBatisNet.DataMapper.Mapper.Instance().CommitTransaction();
> > return true;
> > }
> > catch
> > {
> > IBatisNet.DataMapper.Mapper.Instance().RollbackTransaction();
> > throw;
> > }
> > }
> >
> > public void ProcessBar(int bar)
> > {
> > IBatisNet.DataMapper.Mapper.Instance().BeginTransaction();
> > try
> > {
> > // snip
> > IBatisNet.DataMapper.Mapper.Instance().CommitTransaction();
> > }
> > catch
> > {
> > IBatisNet.DataMapper.Mapper.Instance().RollbackTransaction();
> > throw;
> > }
> > }
> >
> > Calling ProcessBar within Update will raise (as expected) an
> exception
> > of:
> >
> > "
> > SqlMap could not invoke BeginTransaction(). A Transaction is
> already
> > started. Call CommitTransaction() or RollbackTransaction first.
> > "
> >
> > How do I test if a transaction has already been started?
> >
> > I saw this in SqlMapSession.cs:
> >
> > private bool _isOpenTransaction = false;
> >
> > If that were a public property (added to IDalSession ???), I may be
> > able to write my own *Transaction methods like this:
> >
> > // ???
> > protected virtual void BeginTransaction()
> > {
> > if (IBatisNet.DataMapper.Mapper.Instance().IsOpenTransaction ==
> false)
> > {
> > IBatisNet.DataMapper.Mapper.Instance().BeginTransaction();
> > }
> > }
> >
> > Then when I call ProcessBar, I shouldn't get the exception.
> >
> > I think I'm looking for some kind of "HasTransactionBeenStarted"
> > property.
> >
> > I think this accomplishes the same thing without having to modify
> > anything:
> >
> > // ???
> > protected virtual void BeginTransaction()
> > {
> > IDalSession session = Mapper.Instance().LocalSession;
> > if (session.Transaction == null)
> > {
> > session.BeginTransaction();
> > }
> > }
> >
> > Is there a better way to do all of this?
> >
> > Thanks,
> > Ron
> >
>