Sql 在查询和插入之间锁定数据库表
如果这是一个愚蠢的问题,请原谅,我对数据库和SQL是新手,但是是否可以锁定一个表,类似于C中的lock关键字,以便我可以查询数据库以查看是否满足条件,然后插入一行,同时确保表的状态在两个操作之间没有更改 在本例中,我有一个表transactions,它有两列:user和product。这是一种多对一的关系;多个用户可以拥有相同的产品。然而,产品的数量是有限的 当用户向其帐户中添加产品时,我想首先检查具有相同产品值的项目总数是否低于某个阈值,然后再添加事务。但是,由于这是一个多线程应用程序,因此可以同时进入多个事务。我想确保其中一个被拒绝,另一个成功,这样具有相同产品价值的交易数量永远不会超过限制 我尝试执行的操作的粗略伪代码:Sql 在查询和插入之间锁定数据库表,sql,multithreading,sqlite,locking,Sql,Multithreading,Sqlite,Locking,如果这是一个愚蠢的问题,请原谅,我对数据库和SQL是新手,但是是否可以锁定一个表,类似于C中的lock关键字,以便我可以查询数据库以查看是否满足条件,然后插入一行,同时确保表的状态在两个操作之间没有更改 在本例中,我有一个表transactions,它有两列:user和product。这是一种多对一的关系;多个用户可以拥有相同的产品。然而,产品的数量是有限的 当用户向其帐户中添加产品时,我想首先检查具有相同产品值的项目总数是否低于某个阈值,然后再添加事务。但是,由于这是一个多线程应用程序,因此可
my_user, my_product = ....
my_product_count = 0
for each transaction in transactions:
if product == my_product:
my_product_count += 1
if my_product_count < LIMIT:
insert my_user, my_product into transactions
return SUCCESS
else:
return FAILURE
我将SQLAlchemy与SQLite3一起使用,如果这很重要的话。如果您在一个事务中同时执行这两个操作,则不需要使用SQLAlchemy,这是由数据库支持的。数据库维护锁以保证事务完整性。事实上,这是数据库的四大支柱之一——它们被称为原子性、一致性、隔离性和持久性的ACID保障 因此,在您的情况下,为了确保一致性,您将在一个事务中执行这两个操作,并以这样的方式设置事务参数,以阻止已读取行上的读取 SQL锁定比lock语句更强大,因为除其他外,每个定义的数据库都有多个线程用户访问相同的数据——这在编程中非常罕见,因为在多线程编程中尽可能避免相同的数据访问
我建议你读一本关于SQL的好书,因为你需要在某一点上简单地学习一些基本概念,否则你会犯一些花钱的错误。事务允许你原子地使用多个SQL语句。 SQLite通过锁定整个数据库来实现事务,但确切的机制并不重要,而且您可能希望稍后使用另一个数据库 但是,如果所需的算法可以用单个SQL语句处理,则您甚至不需要处理显式事务,如下所示:
INSERT INTO transactions(user, product)
SELECT @my_user, @my_product
WHERE (SELECT COUNT(*)
FROM transactions
WHERE product = @my_product) < @LIMIT;