假设我有一个依赖于 SQL 'users' 表的应用程序,并希望避免使用多个同名用户:
当我在我的表中插入一个新用户时,我必须确保已经没有类似的行。所以这是 2 个查询,第二个查询仅在第一个查询没有返回时发生:
-query1: select * from users where username='Marie-Antoinette'
-query2: insert into users ('','Marie-Antoinette','37')
多个应用实例同时访问共享数据库,如何确保query1和query2之间没有插入查询?它是作为数据库中的原子操作完成的,中间没有任何内容?
可能有一种方法,一种进行条件插入的语法,但我的问题更多是关于“如何确保我可以进行 N 个查询,并保证不会在我的批处理中交错来自其他客户端的查询”?
假设我在我的应用程序中有一个需要 4 个查询的操作:
我的操作包括:
-query1: insert stuff in table 1
-query2: select stuff from table 2
-query3: insert stuff in table 3
-query4: update stuff in table 4
那些应该被视为原子操作,要么全有,要么全无,但不仅如此,在那个序列中,必须保证不会有任何交错的东西(因为在这些查询之间,数据库没有完整性,并且那些发生此操作时必须冻结 4 个表)并且多个客户端可以触发该操作,并且多个调用将以某种方式排队而不是失败。
随着时间的推移,这将是:
-client #1 query 1
-client #1 query 2
-client #1 query 3
-client #1 query 4
-client #2 query 1
-client #2 query 2
-client #2 query 3
-client #2 query 4
-client #1 query 1
-client #1 query 2
-client #1 query 3
-client #1 query 4
实现这一目标的推荐方法是什么?