--- edz...@volcanomail.com wrote:

> I wonder if an automatic rollback, as described in
> //www.sqlite.org/c3ref/busy_handler.html, is more powerful than a 
> rollback programmed in SQL. Particularly if it is able to rollback 
> pending queries from other cursors in the same connection. The 
> programmed rollback fails here with BusyError: cannot rollback 
> transaction - SQL statements in progress. 
> 
> I tried to find out experimentally but failed to reproduce any automatic 
> rollback. It seems another solution is in place. I may be not well 
> informed, is anything written about this already?
> 
> From the timeline it appears there is ongoing development on the 
> subject. Is there any chance that a rollback in SQL will no longer fail 
> with pending queries?

Hello again,

The mechanism of an automatic rollback, as described in 
//www.sqlite.org/c3ref/busy_handler.html, appears to have disappeared somewhere 
between version 3.5.9 and 3.6.5. The following steps should show the different 
behaviour.

- Create a table containing about 1 M byte of data
(i hope anybody can imagine this for himself)

- Let one process keep a shared lock

    $ sqlite3 test.db "select * from t" | more
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    ...
    (leave this command unfinished)

- Start a large transaction, first in the old version

    $ sqlite-amalgamation-3.5.9/sqlite3 test.db
    SQLite version 3.5.9
    Enter ".help" for instructions
    sqlite> begin;
    sqlite> insert into t select * from t;
    sqlite> insert into t select * from t;
    SQL error: disk I/O error
    sqlite> commit;
    SQL error: cannot commit - no transaction is active

- Same for the current version

    $ sqlite3 test.db 
    SQLite version 3.6.19
    Enter ".help" for instructions
    Enter SQL statements terminated with a ";"
    sqlite> begin;
    sqlite> insert into t select * from t;
    sqlite> insert into t select * from t;
    sqlite> commit;
    SQL error: database is locked

The current behaviour looks better, the application may still commit once the 
database is unlocked. However it also has a disadvantage which appears from the 
process status. At the current point this shows:

    $ ps -lp 14440
      UID   PID  PPID CPU PRI NI      VSZ    RSS COMMAND
      501 14440  4281   0  31  0    29936   7088 sqlite3

If the insert step is repeated once again, this becomes:

    $ ps -lp 14440
      UID   PID  PPID CPU PRI NI      VSZ    RSS COMMAND
      501 14440  4281   0  31  0    38176  14056 sqlite3

The memory usage increases about 7000 pages which is in line with the amount of 
data added (4M). This must become a problem if dealing with gigabytes.

I could not find anything written about the change, except a quote from Dan 
Kennedy in the mailing list: 
http://www.mail-archive.com/sqlite-users@sqlite.org/msg42059.html. But then the 
busy_handler description must be out of date.

This derived a bit from the subject, I still would like the more powerful 
rollback in SQL.

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

Reply via email to