mysql - 从 MySQL 检索唯一标识符

标签 mysql jdbc concurrency unique counter

我有一个 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

导致标识符值冲突。允许多个客户端对上述两个查询进行某种“独占访问”以保证函数返回唯一标识符的最佳方法是什么?

非常感谢!

最佳答案

您不需要 2 个查询。

解决方案很简单:

UPDATE table1 SET counter = counter+1 WHERE contract_type = 'A';

你可以玩fiddle

关于mysql - 从 MySQL 检索唯一标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28836185/

相关文章:

php - SELECT 记录 WHERE 行在特定列上有差异

mysql - mysql 5.7版本默认make lock table吗?

scala - 如何处理对 Scala 集合的并发访问?

mysql - 查询 "upvotes"最多的项目的最佳方法

php - 使用brew启动mysql时出错

java - 握手期间通信失败。本地主机 :3306 上是否有运行 MySQL 服务器

wpf - 如何进入VS中的线程 View

android - Dalvik VM 和 Java 内存模型(Android 上的并发编程)

java - 如何克服这个错误 "com.mongodb.diagnostics.logging.JULLogger log"

java - 从数据库中获取值的好方法