Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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
Java 如何在mysql中避免重复而不使用唯一密钥_Java_Mysql_Hibernate - Fatal编程技术网

Java 如何在mysql中避免重复而不使用唯一密钥

Java 如何在mysql中避免重复而不使用唯一密钥,java,mysql,hibernate,Java,Mysql,Hibernate,这是一个用例,其中唯一密钥约束可以根据帐户而不同。因此,不能使用主键/唯一键约束来实现复制限制 假设表T1有C1、C2、C3、C4、C5列,我们有两个账户A1和A2。A1和A2的数据进入同一个表T1。但是,为了获得帐户A1的独特记录,我们考虑C1和C2列,对于帐户A2,我们考虑C3和C3。像wise一样,我们可以创建许多帐户,每个帐户都有一组不同的列来标识唯一的记录 因此,我们在Java代码中进行了检查。但是,如果有两个重复的并发请求,那么两个Java线程会看到该成员不存在,并且它们都会插入记录

这是一个用例,其中唯一密钥约束可以根据帐户而不同。因此,不能使用主键/唯一键约束来实现复制限制

假设表T1有C1、C2、C3、C4、C5列,我们有两个账户A1和A2。A1和A2的数据进入同一个表T1。但是,为了获得帐户A1的独特记录,我们考虑C1和C2列,对于帐户A2,我们考虑C3和C3。像wise一样,我们可以创建许多帐户,每个帐户都有一组不同的列来标识唯一的记录

因此,我们在Java代码中进行了检查。但是,如果有两个重复的并发请求,那么两个Java线程会看到该成员不存在,并且它们都会插入记录,从而产生重复。如何防止此类重复插入


我可以通过使用行级锁或Hibernate的乐观并发来防止更新。我可以考虑使用表级锁来防止此类插入,但会限制应用程序的性能,因为它还会阻止更新。

将密钥作为主密钥来代替unique

修复您的模型,或者不必使用sql:-(不同的列不能有不同的主键。正如@草莓所建议的,您需要修复您的模型。您可以有一个帐户id列和一组列(例如C1和C2)。使用帐户id和列(可以是accid和col1或accid和col2或accid、col1和col2)创建一个复合键