我有一个 Web 应用程序(MySQL 上的 JSP/Tomcat),它提供填写在线契约(Contract)的功能,并且需要在最后向客户端返回一个唯一的计数器或标识符作为契约(Contract)的协议(protocol)。如果两个客户端同时确认表单,则 db 上的 SELECT MAX(COUNTER) 不能防止标识符冲突。
我有一个表,用于跟踪每种契约(Contract)类型的客户可用的下一个标识符:
CONTRACT_TYPE COUNTER
A 21
B 13
获取下一个标识符的方法是:
public int getNewCounter(String contractType) {
query1 = SELECT (COUNTER + 1) AS NEW_COUNTER from mytable WHERE CONTRACT_TYPE = 'A'
query2 = UPDATE mytable SET COUNTER = <counter_returned_on_previous> WHERE CONTRACT_TYPE = 'A'
return NEW_COUNTER;
}
这存在一个问题,即并发客户端如果在同一时刻提交表单,则可能会收到相同的标识符,而这是我想避免的。
换句话说,对于 2 个并发客户端,可能会发生这种情况:
client1-query1
client1-query2
client2-query1
client2-query2
这是正确的行为,但我也可以这样做:
client1-query1
client2-query1
client1-query2
client2-query2
导致标识符值冲突。允许多个客户端对上述两个查询进行某种“独占访问”以保证函数返回唯一标识符的最佳方法是什么?
非常感谢!
最佳答案
关于mysql - 从 MySQL 检索唯一标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28836185/