Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在查询和插入之间锁定数据库表_Sql_Multithreading_Sqlite_Locking - Fatal编程技术网

Sql 在查询和插入之间锁定数据库表

Sql 在查询和插入之间锁定数据库表,sql,multithreading,sqlite,locking,Sql,Multithreading,Sqlite,Locking,如果这是一个愚蠢的问题,请原谅,我对数据库和SQL是新手,但是是否可以锁定一个表,类似于C中的lock关键字,以便我可以查询数据库以查看是否满足条件,然后插入一行,同时确保表的状态在两个操作之间没有更改 在本例中,我有一个表transactions,它有两列:user和product。这是一种多对一的关系;多个用户可以拥有相同的产品。然而,产品的数量是有限的 当用户向其帐户中添加产品时,我想首先检查具有相同产品值的项目总数是否低于某个阈值,然后再添加事务。但是,由于这是一个多线程应用程序,因此可

如果这是一个愚蠢的问题,请原谅,我对数据库和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;