Hi Richard,

I haven't had any response from anyone else so I thought I'd try you direct
Richard.

I'm wondering what logic I should employ to prevent mutual exclusion
occurring.

I'm using SQLite to record an audit trail from a web application - I count
the number of edits, searches and the maximum number of concurrent users.
Each user opens a connection to the database for the duration of their
session.

The audit logic is as follows;

   begin transaction
   select total from useractivity where event= .....
   If lRows = 0 Then
       insert into useractivity(timestamp,datasource,event,total) values
......
   Else
       update useractivity set total=total+1 where datasource= .....
   End If
   commit transaction

What is happening is that the insertion/update in thread A locks the
database.  Before thread A gets the chance to commit the transaction, thread
B also attempts an update/insertion.  This causes thread A to be locked out
from committing the change.  I don't have any recovery code in the logic so
we're then in a situation whereby the database is locked for everyone,
permanently or until all the sessions die and each thread closes it's
handle.

This can't be right can it ?

Where should I do my busy checking and recovery logic to prevent this mutual
exclusion?

Steve




-----Original Message-----
From: Steve O'Hara [mailto:[EMAIL PROTECTED]
Sent: 08 September 2004 01:42
To: [EMAIL PROTECTED]
Subject: [sqlite] Locking in 3.0.6



I'm having difficulty understanding the locking regime in SQLite 3.

I open the same database with 2 processes (sqlite3.exe for instance).
In process 1 I begin a transaction and insert a row.
In process 2 I also begin a transaction and insert a row - this fails on the
insert with an expected "database is locked" error
In process 1 I now do a commit, but this now also fails with "database is
locked" !!

Am I missing something here or is that a little odd ?

I assumed that the first thread to get a WRITE lock would be the controlling
thread and the database would be locked until that thread relinquished the
lock by calling commit or rollback.  How can it be that a writer that has a
change pending is blocked from committing that change by another thread that
hasn't actually attempted a change ?

Steve



Reply via email to