在mysql中,建议依赖唯一性约束或手动检查行是否已存在?

时间:2015-04-20 20:10:34

标签: java mysql

我有一张桌子:

userId | subject 

两者的唯一性约束。

现在我每隔几分钟就会向这张桌子写几千行。数据流来自队列,可能会重复。但是,我必须确保表中只有一个userId,subject的唯一组合。

目前我依赖于mysql的唯一性约束,它会抛出异常。

另一种方法是运行SELECT count(*)查询以检查此行是否已存在,然后在需要时跳过它。

因为我想平均每秒写4行,这是可取的。

编程语言:Java

修改

以防我不清楚这里的问题是,依赖于MYSQL抛出异常是否更好或者在插入操作之前运行select查询在性能方面更好。

我认为select查询比INSERT查询的CPU / IO密集程度更低。如果我运行太多INSERTS会不会创建很多锁?

2 个答案:

答案 0 :(得分:3)

MySQL是ACID并采用事务锁定,因此依赖其唯一性约束是非常标准的。请注意,您可以通过PRIMARY KEY或UNIQUE KEY执行此操作(但如果可以,请使用前者)。

答案 1 :(得分:2)

唯一约束对于完整的已提交数据集是唯一的。

有几个数据库允许设置“事务隔离级别”。

userId    subject
A         1
B         2
-------------------------
A         2
A         3

该行上方的两行已提交。每个连接都可以读取这些行。该行下面的两行目前已在您的交易中写入。在此连接中,所有四条线都可见。

如果另一个线程/连接/事务试图存储A-2,则在两个事务之一中会有一个例外(第一个可以提交事务,第二个不能)。

其他隔离级别可能会提前失败。但是不可能违反Unique-key约束。