来自其他select语句的curs.execute('begin immediate')锁定表吗?

时间:2015-08-09 22:43:42

标签: python sqlite

我似乎无法为此找到明确的答案,问题是,如果我在select语句之后执行“cursor.execute('begin immediate')”语句,后跟一个delete语句,然后是一个insert语句然后是commit语句,数据库是否会在select语句之前锁定并一直锁定到commit语句?

我想要这样做的原因是因为我有一个我基本上旋转的表,取表中的第一条记录,从结果中创建几个变量,然后取出该记录,删除它然后重新插入作为表中的最后一条记录。我遇到的问题是我同时运行4个脚本,所有脚本都做同样的事情,即使表开始看起来像这样:

rowid 1, num 1
rowid 2, num 2
rowid 3, num 1
rowid 4, num 2
rowid 5, num 1
rowid 6, num 2
rowid 7, num 1
rowid 8, num 2

过了一段时间,桌子最终看起来像这样:

rowid 250, num 2
rowid 251, num 1
rowid 252, num 1
rowid 253, num 2
rowid 254, num 2
rowid 255, num 2
rowid 256, num 1
rowid 257, num 1

我认为它最终是这样的,因为有时第二个脚本会在第一个脚本之后但在第一个脚本有机会旋转表之前执行选择。

这是我现在的脚本:

##### get the next number from the db and rotate the table records
curs.execute('SELECT rowid, num FROM tbl_wheel ORDER BY rowid ASC LIMIT 1')
for row in curs:
    rowid = row[0]
    num = row[1]
query_rotate = 'DELETE FROM tbl_wheel WHERE rowid = ' + str(rowid)
curs.execute('begin')
curs.execute(query_rotate)
curs.execute('INSERT INTO tbl_wheel (num) VALUES (?)', str(num))
conn.commit()

我想知道我是否可以解决这个问题:

##### get the next number from the db and rotate the table records
curs.execute('begin immediate')
curs.execute('SELECT rowid, num FROM tbl_wheel ORDER BY rowid ASC LIMIT 1')
for row in curs:
    rowid = row[0]
    num = row[1]
query_rotate = 'DELETE FROM tbl_wheel WHERE rowid = ' + str(rowid)
curs.execute(query_rotate)
curs.execute('INSERT INTO tbl_wheel (num) VALUES (?)', str(num))
conn.commit()
编辑:为了澄清,我运行的4个脚本做同样的事情,我应该说他们每个人做的大致相同但有点不同,这取决于它从db获得的变量。然后他们各自做自己的事情,但然后返回做彼此完全相同的事情,即返回从数据库中抓取下一个变量。

0 个答案:

没有答案