Hi,

The problem: database locks are left behind after the statement 
handles of simple select statements are closed, e.g. $sth->finish; 
and undef $sth; when I fetch BLOB fields from DB2 using AutoCommit=0.

Some hobby-analysis follows: I did some tracing in DBI and it after 
the last call to fetch() it seems like the outer handle is never 
destroyed (?)

    <- fetch= ( undef ) [1 items] row1 at dbitest.pl line 20
    >> DESTROY     DISPATCH (DBI::st=HASH(0xb2a828) rc1/1 @1 g2 ima10004 
pid#23683) at dbitest.pl line 15 via  at dbitest.pl line 15
    <> DESTROY(DBI::st=HASH(0xb2a828)) ignored for outer handle (inner 
DBI::st=HASH(0x9a2008) has ref cnt 1)
    >> DESTROY     DISPATCH (DBI::st=HASH(0x9a2008) rc1/1 @1 g2 ima10004 
pid#23683) at dbitest.pl line 15 via  at dbitest.pl line 15
    -> DESTROY for DBD::DB2::st (DBI::st=HASH(0x9a2008)~INNER) thr#77f010

.. since there exists an inner handle (guess). But then it will
never destroy the global handle later (guess)? I am looking at
the following code comment:

  /* XXX might be better to move this down to after call_depth has been
   * incremented and then also SvREFCNT_dec(mg->mg_obj) to force an immediate
   * DESTROY of the inner handle if there are no other refs to it.
   * That way the inner DESTROY is properly flagged as a nested call,
   * and the outer DESTROY gets profiled more accurately, and callbacks work.
   */
  if (trace_level >= 3) {
      PerlIO_printf(DBILOGFP,
          "%c   <> DESTROY(%s) ignored for outer handle (inner %s has ref cnt 
%ld)\n",
          (PL_dirty?'!':' '), neatsvpv(h,0), neatsvpv(mg->mg_obj,0),
          (long)SvREFCNT(SvRV(mg->mg_obj))
      );
  }

Then again, I have no idea if my quick analysis of the problem is 
correct (I am not a perl developer, nor DBI/DBD developer), pardon 
my ignorance. But it seems like that thing should be destroyed 
later?

/K

Reply via email to