"Igor Tandetnik" <[email protected]> writes:
> Nikolaus Rath wrote:
>> "Igor Tandetnik" <[email protected]> writes:
>>> Nikolaus Rath <[email protected]> wrote:
>>>> How can I determine the rowid of the last insert if I am accessing
>>>> the db from different threads? If I understand correctly,
>>>> last_insert_rowid() won't work reliably in this case.
>>>
>>> Last inserted rowid is maintained per connection. Do your threads use
>>> the same connection, or each create their own?
>>
>> Same connection, just different cursors.
>>
>>> If all threads share the same connection, it is your responsibility
>>> to make "insert then retrieve last rowid" an atomic operation, using
>>> thread synchronization mechanism of your choice. Just as with any
>>> access to shared data.
>>
>> Is BEGIN ... COMMIT sufficient for that?
>
> No. Transaction is also maintained per connection. Starting a
> transaction would prevent other connections from making concurrent
> changes, but wouldn't block other threads using the same connection.
Actually it seems to do exactly that:
,----
| $ cat test.py
| import apsw
| import threading
| import time
|
| conn = apsw.Connection('test.db')
|
| def thread1():
| cur = conn.cursor()
| cur.execute("BEGIN")
| print "Thread 1 in transaction"
| time.sleep(5)
| print "Thread 1 finished."
|
| def thread2():
| cur = conn.cursor()
| time.sleep(2)
| cur.execute("BEGIN")
| print "Thread 2 in transaction"
| time.sleep(5)
| print "Thread 2 finished."
|
|
| threading.Thread(target=thread1).start()
| threading.Thread(target=thread2).start()
`----
,----
| $ python test.py
| Thread 1 in transaction
| Exception in thread Thread-2:
| Traceback (most recent call last):
| File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner
| self.run()
| File "/usr/lib/python2.6/threading.py", line 477, in run
| self.__target(*self.__args, **self.__kwargs)
| File "test.py", line 17, in thread2
| cur.execute("BEGIN")
| File "apsw.c", line 4238, in resetcursor
| SQLError: SQLError: cannot start a transaction within a transaction
|
| Thread 1 finished.
`----
Best,
-Nikolaus
--
»Time flies like an arrow, fruit flies like a Banana.«
PGP fingerprint: 5B93 61F8 4EA2 E279 ABF6 02CF A9AD B7F8 AE4E 425C
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users