我正在尝试执行以下操作:
- 表 A 只有一列由唯一数字组成(非连续)
- 表 B 有两列,一个 id(唯一的非连续整数)和一个 hit_number(正整数)
给定一个数字和一个 ID,我想:
检查数字是否存在于表 A 中。
- 如果它存在,那么不要做任何事情,让我知道
- 如果它不存在,请将其插入表 A,增加表 B 中与此 id 对应的 hit_number 列并让我知道。
它需要在一个事务中完成,如果两个并发连接使用相同的值进行,hit_number 应该只增加一个(所以我想我需要一些隔离)。
我想出了一个解决方案(在这个例子中我使用 sqlite 和 python),但我不确定它是否足够好:
就像是
con = sqlite3.connect(":memory:", isolation_level="EXCLUSIVE")
con.execute("create table A (num integer primary key);")
con.execute("create table B (user_id integer primary key, hit_number integer);")
# ... fill it with something
def hit(v, id, con):
try:
with con:
con.execute("INSERT INTO A VALUES (?);" +
"UPDATE B SET hit_number=hit_number+1 WHERE user_id=(?);", (v, id))
except sqlite3.IntegrityError:
return False
return True
这个交易会是原子的吗?我真的需要 EXCLUSIVE 还是较低的隔离级别会给出完全相同的行为?有没有更好的办法?