Uniquness检查没有DB约束

时间:2016-12-14 11:09:26

标签: java multithreading web-applications

例如,我们有一个表(登录,哈希)。我们对登录列没有unique约束,但我们应该保持它唯一(例如)。 当新用户注册时,我们检查输入的登录是否是免费的。 如果它是部署到Tomcat的java Web应用程序,它具有线程池,那么这些检查可能会并行处理,对吧?那么如何确保独特性?

2 个答案:

答案 0 :(得分:1)

您可以在表格中使用悲观锁定,这将锁定表格,您可以检查是否已保存,因此其他线程暂时无法更改该表格。但我认为这是一种非常糟糕的做事方式,为什么不使用数据库约束?

答案 1 :(得分:1)

简而言之,如果没有数据库限制,你就无法找到一个好的解决方案。

如果没有多线程环境中的约束,您将需要一些公共资源来同步您的线程。线程将获取互斥锁,检查登录是否空闲(使用SELECT)然后INSERT新记录是否空闲。没有其他线程可以同时执行此操作 - 这就是您需要在此处进行同步的原因。

如果你的所有线程都可以访问这个互斥锁,并且保证没有其他人可以同时访问数据库,那么这将有效。

如果您有多个访问同一数据库的计算机,则会出现第一个问题。在不同机器上运行的线程将无法访问相同的互斥锁,因此它们将很乐意并行地插入到您的表中。

另一个问题是,如果某人登录到数据库并直接在该表中创建记录,则此类插入可能恰好发生在从代码执行的SELECT和INSERT之间。所以代码中的同步对此没有帮助。

另一个选择是锁定整个表格,但情况更糟。你需要非常可靠地释放锁,否则你就有可能拖延整个系统。