I would guess that your requests acquire (shared) read locks when the
transaction starts and then fail/deadlock when they try to upgrade this
to a write lock in your insert/update statement. Maybe it would help to
start the transactions with "BEGIN IMMEDIATE" or "BEGIN EXCLUSIVE"...?
Ulrich Schöbel wrote:
> Hi all,
>
> I'm using sqlite3 inside a Tcl module (mod_websh) of
> apache. Everything works fine, except when it comes
> to concurrent write accesses.
>
> There's a small transaction where I update two rows.
> When I stress the web server it generates a
> "database locked" error. I invoke a "db timeout 2000"
> just before the transaction, but it doesn't seem to
> have any effect.
>
> When I stumbled over this problem I increased the
> timeout to 500000, which is much longer than the
> stress test takes, but the error persists. What's
> going wrong here?
>
> Here's a short code snippet:
>
> db timeout 500000
> db transaction {
> set last_acc [lindex [db eval {
> select acc_time from last_hit where site = $site and from_ip = $ip
> }] 0]
> if {![string length $last_acc]} {
> db eval {
> insert into last_hit values ($site , $ip , $now)
> }
> set last_acc 0
> } else {
> db eval {
> update last_hit set acc_time = $now where site = $site and from_ip =
> $ip }
> }
> ......
> } ;# end of transaction
>
> There's another update inside this transaction, but
> it's always the one above that fails.
>
> Maybe the "busy" method is better suited here, but
> the docs say nothing about its usage.
>
> Thanks for any help
>
> Ulrich
>
> -----------------------------------------------------------------------------
> To unsubscribe, send email to [EMAIL PROTECTED]
> -----------------------------------------------------------------------------
>
-----------------------------------------------------------------------------
To unsubscribe, send email to [EMAIL PROTECTED]
-----------------------------------------------------------------------------