I'm currently working with version 3.6.14 on Windows XP/SP4 (32-bit).  The
application is coded for Unicode.

I wrote all of the application (MS C++ native code) excluding SQLite, so I'm
confident that it is a single-threaded app.  Threads have never been part of
its design.

The failure occurs in a common service routine called perhaps 300 times
before this error is reported.

The failure occurs every time I run the program and always occurs in the
same place.

While executing the following set BEGIN/DELETE/COMMIT/BEGIN/INSERT/COMMIT
commands approximately once per second, SQLite is returning 0x05 (BUSY) on
the first COMMIT in the second iteration of the loop.  A journal file does
exist when the BUSY condition is returned. 

Because this is a single-threaded app, waiting for the lock to clear doesn't
work.

In the following source code, "SQLiteError ( )" is a common services routine
that provides a message box and logging in the event of an error.

Source code:

  SqlDB   = NULL ;

  SqlStmt = NULL ;

  SqlStatus = sqlite3_open16 ( db_loc_string

                             , &SqlDB

                             ) ;

  if ( SQLITE_OK != SqlStatus )

  {

    SQLiteError ( NULL

                , L"sqlite3_open16 ( )"

                ) ;

    sqlite3_close ( SqlDB ) ; SqlDB = NULL ;

    return DATASTORE_UNAVAILABLE ;

  }

 

 

  SqlStatus = sqlite3_open16 ( SqlDB

                                   , L"BEGIN TRANSACTION"

                                   , 36

                                   , &SqlStmt

                                   , NULL

                                   ) ;

  if ( SQLITE_OK != SqlStatus )

  {

    SQLiteError ( L"BEGIN TRANSACTION 1"

                , L"sqlite3_prepare16_V2 ( )"

                ) ;

    sqlite3_close ( SqlDB ) ; SqlDB = NULL ;

    return SQL_PREP_ERROR ;

  }

 

 

  SqlStatus = sqlite3_prepare16_v2 ( SqlDB

                                   , L"BEGIN TRANSACTION"

                                   , 36

                                   , &SqlStmt

                                   , NULL

                                   ) ;

  if ( SQLITE_OK != SqlStatus )

  {

    SQLiteError ( L"BEGIN TRANSACTION 1"

                , L"sqlite3_prepare16_V2 ( )"

                ) ;

    sqlite3_close ( SqlDB ) ; SqlDB = NULL ;

    return SQL_PREP_ERROR ;

  }

 

 

  SqlStatus = sqlite3_step ( SqlStmt ) ;

  if ( SQLITE_DONE != SqlStatus )

  {

    SQLiteError ( L"BEGIN TRANSACTION 1"

                , L"sqlite3_step ( )"

                ) ;

    sqlite3_finalize ( SqlStmt ) ; SqlStmt = NULL ;

    sqlite3_close    ( SqlDB   ) ; SqlDB   = NULL ;

    return TXN_BEGIN_FAILED ;

  }

 

 

  SqlStatus = sqlite3_finalize ( SqlStmt ) ; SqlStmt = NULL ;

  if ( SQLITE_OK != SqlStatus )

  {

    SQLiteError ( L"BEGIN TRANSACTION 1"

                , L"sqlite3_finalize ( )"

                ) ;

    sqlite3_close ( SqlDB ) ; SqlDB = NULL ;

    return SQL_FNLZ_ERROR ;

  }

 

 

  swprintf_s ( (PXID_CHAR)sql_statement

             , sizeof ( sql_statement ) / sizeof ( XID_CHAR )

             ,   L"DELETE"

                  L" FROM RSPNS"

                 L" WHERE . . .

             ) ;

  SqlStatus = sqlite3_prepare16_v2 ( SqlDB

                                   , sql_statement

                                   , ( lstrlen ( sql_statement ) + 1 ) *
sizeof ( XID_CHAR )

                                   , &SqlStmt

                                   , NULL

                                   ) ;

  if ( SQLITE_OK != SqlStatus )

  {

    SQLiteError ( sql_statement

                , L"sqlite3_prepare16_v2 ( )"

                ) ;

    sqlite3_close ( SqlDB ) ; SqlDB = NULL ;

    return SQL_PREP_ERROR ;  //  IMPLICIT DATA BASE ROLLBACK

  }

 

 

  SqlStatus = sqlite3_step ( SqlStmt ) ;

  if ( SQLITE_DONE != SqlStatus )

  {

    SQLiteError ( sql_statement

                , L"sqlite3_step ( )"

                ) ;

    sqlite3_finalize ( SqlStmt ) ; SqlStmt = NULL ;

    sqlite3_close    ( SqlDB   ) ; SqlDB   = NULL ;

    return SQL_DLET_ERROR ;

  }

 

 

  SqlStatus = sqlite3_finalize ( SqlStmt ) ; SqlStmt = NULL ;

  if ( SQLITE_OK != SqlStatus )

  {

    SQLiteError ( sql_statement

                , L"sqlite3_finalize ( )"

                ) ;

    sqlite3_close ( SqlDB ) ; SqlDB = NULL ;

    return SQL_FNLZ_ERROR ;

  }

 

 

  SqlStatus = sqlite3_prepare16_v2 ( SqlDB

                                   , L"COMMIT TRANSACTION"

                                   , 38

                                   , &SqlStmt

                                   , NULL

                                   ) ;

  if ( SQLITE_OK != SqlStatus )

  {

    SQLiteError ( L"COMMIT TRANSACTION 1"

                , L"sqlite3_prepare16_V2 ( )"

                ) ;

    sqlite3_close ( SqlDB ) ; SqlDB = NULL ;

    return SQL_PREP_ERROR ;

  }

 

 

  SqlStatus = sqlite3_step ( SqlStmt ) ;

  if ( SQLITE_DONE != SqlStatus )

  {

    SQLiteError ( L"COMMIT TRANSACTION 1"

                , L"sqlite3_step ( )"

                ) ;

    sqlite3_finalize ( SqlStmt ) ; SqlStmt = NULL ;

    sqlite3_close    ( SqlDB   ) ; SqlDB   = NULL ;

    return TXN_COMMIT_FAILED ;

  }

 

 

  SqlStatus = sqlite3_finalize ( SqlStmt ) ; SqlStmt = NULL ;

  if ( SQLITE_OK != SqlStatus )

  {

    SQLiteError ( L"COMMIT TRANSACTION 1"

                , L"sqlite3_finalize ( )"

                ) ;

    sqlite3_close ( SqlDB ) ; SqlDB = NULL ;

    return SQL_FNLZ_ERROR ;

  }

 

  SqlStatus = sqlite3_prepare16_v2 ( SqlDB

                                   , L"BEGIN TRANSACTION"

                                   , 36

                                   , &SqlStmt

                                   , NULL

                                   ) ;

  if ( SQLITE_OK != SqlStatus )

  {

    SQLiteError ( L"XID_DBPA_TACL6530::SaveResponse ( )"

                , L"BEGIN TRANSACTION 2"

                , L"sqlite3_prepare16_V2 ( )"

                ) ;

    sqlite3_close ( SqlDB ) ; SqlDB = NULL ;

    return SQL_PREP_ERROR ;

  }

 

  /*-------------------------*/

 

  SqlStatus = sqlite3_step ( SqlStmt ) ;

  if ( SQLITE_DONE != SqlStatus )

  {

    SQLiteError ( L"BEGIN TRANSACTION 2"

                , L"sqlite3_step ( )"

                ) ;

    sqlite3_finalize ( SqlStmt ) ; SqlStmt = NULL ;

    sqlite3_close    ( SqlDB   ) ; SqlDB   = NULL ;

    return TXN_BEGIN_FAILED ;

  }

 

 

  SqlStatus = sqlite3_finalize ( SqlStmt ) ; SqlStmt = NULL ;

  if ( SQLITE_OK != SqlStatus )

  {

    SQLiteError ( L"BEGIN TRANSACTION 2"

                , L"sqlite3_finalize ( )"

                ) ;

    sqlite3_close ( SqlDB ) ; SqlDB = NULL ;

    return SQL_FNLZ_ERROR ;

  }

 

 

  . . .

 

                 swprintf_s ( (PXID_CHAR)sql_statement

                            , sizeof ( sql_statement ) / sizeof ( XID_CHAR )

                            ,   L"INSERT"

                                 L" INTO RSPNS"

                                    L" ( SERVER_NAME"

                                    L" , DBMS_ID"

                                    L" , REQUEST_TYPE"

                                    L" , REQUEST_DATE"

                                    L" , REQUEST_TIME"

                                    L" , RESPONSE_LINE"

                                    L" , RESPONSE_TEXT"

                                    L" )"

                             L" VALUES ( '%s'"

                                    L" , %hu"

                                    L" , %lu"

                                    L" , '%s'"

                                    L" , '%s'"

                                    L" , %lu"

                                    L" , '%s'"

                                    L" )"

                           , ServerName

                           , DbmsId

                           , CommandType

                           , date_string

                           , time_string

                           , line_counter

                           , &InputBuffer[m]

                           ) ;

 

 

                 SqlStatus = sqlite3_prepare16_v2 ( SqlDB

                                                  , (const char
*)sql_statement

                                                  , ( lstrlen (
sql_statement ) + 1 ) * sizeof ( XID_CHAR )

                                                  , &SqlStmt

                                                  , NULL

                                                  ) ;

                 if ( SQLITE_OK != SqlStatus )

                 {

                   SQLiteError ( sql_statement

                               , L"sqlite3_prepare16_v2 ( )"

                               ) ;

                   sqlite3_close ( SqlDB ) ; SqlDB = NULL ;

                   return SQL_PREP_ERROR ;

                 }

 

 

                 SqlStatus = sqlite3_step ( SqlStmt ) ;

                 if ( SQLITE_DONE != SqlStatus )

                 {

                   SQLiteError ( sql_statement

                               , L"sqlite3_step ( )"

                               ) ;

                   sqlite3_finalize ( SqlStmt ) ; SqlStmt = NULL ;

                   sqlite3_close    ( SqlDB   ) ; SqlDB   = NULL ;

                   return SQL_ISRT_ERROR ;

                 }

 

 

                 SqlStatus = sqlite3_finalize ( SqlStmt ) ;

                 if ( SQLITE_OK != SqlStatus )

                 {

                   SQLiteError ( sql_statement

                               , L"sqlite3_finalize ( )"

                               ) ;

                   sqlite3_close ( SqlDB ) ; SqlDB = NULL ;

                   return XID_DBPA_SQL_FNLZ_ERROR ;

                 }

 

  . . .

 

  SqlStatus = sqlite3_prepare16_v2 ( SqlDB

                                   , L"COMMIT TRANSACTION"

                                   , 38

                                   , &SqlStmt

                                   , NULL

                                   ) ;

  if ( SQLITE_OK != SqlStatus )

  {

    SQLiteError ( L"XID_DBPA_TACL6530::SaveResponse ( )"

                , L"COMMIT TRANSACTION 2"

                , L"sqlite3_prepare16_V2 ( )"

                ) ;

    sqlite3_close ( SqlDB ) ; SqlDB = NULL ;

    return XID_DBPA_SQL_PREP_ERROR ;

  }

 

 

  SqlStatus = sqlite3_step ( SqlStmt ) ;

  if ( SQLITE_DONE != SqlStatus )

  {

    SQLiteError ( L"XID_DBPA_TACL6530::SaveResponse ( )"

                , L"COMMIT TRANSACTION 2"

                , L"sqlite3_step ( )"

                ) ;

    sqlite3_finalize ( SqlStmt ) ; SqlStmt = NULL ;

    sqlite3_close    ( SqlDB   ) ; SqlDB   = NULL ;

    return XID_DBPA_TXN_COMMIT_FAILED ;

  }

 

 

  SqlStatus = sqlite3_finalize ( SqlStmt ) ; SqlStmt = NULL ;

  if ( SQLITE_OK != SqlStatus )

  {

    SQLiteError ( L"XID_DBPA_TACL6530::SaveResponse ( )"

                , L"COMMIT TRANSACTION 2"

                , L"sqlite3_finalize ( )"

                ) ;

    sqlite3_close ( SqlDB ) ; SqlDB = NULL ;

    return XID_DBPA_SQL_FNLZ_ERROR ;

  }

 

  sqlite3_close ( SqlDB ) ; SqlDB = NULL ;

The aforementioned message box and log tell me that the failure is detected
in the first COMMIT TRANSACTION on sqlite3_step ( ).

All of the archive content on SQLITE_BUSY appears to assume multi-threaded
database access; I have only a primary thread.

-   - Alan T.

 

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to