我有一张桌子:
userId | subject
两者的唯一性约束。
现在我每隔几分钟就会向这张桌子写几千行。数据流来自队列,可能会重复。但是,我必须确保表中只有一个userId,subject的唯一组合。
目前我依赖于mysql的唯一性约束,它会抛出异常。
另一种方法是运行SELECT count(*)查询以检查此行是否已存在,然后在需要时跳过它。
因为我想平均每秒写4行,这是可取的。
编程语言:Java
修改
以防我不清楚这里的问题是,依赖于MYSQL抛出异常是否更好或者在插入操作之前运行select查询在性能方面更好。
我认为select查询比INSERT查询的CPU / IO密集程度更低。如果我运行太多INSERTS会不会创建很多锁?
答案 0 :(得分:3)
MySQL是ACID并采用事务锁定,因此依赖其唯一性约束是非常标准的。请注意,您可以通过PRIMARY KEY或UNIQUE KEY执行此操作(但如果可以,请使用前者)。
答案 1 :(得分:2)
唯一约束对于完整的已提交数据集是唯一的。
有几个数据库允许设置“事务隔离级别”。
userId subject
A 1
B 2
-------------------------
A 2
A 3
该行上方的两行已提交。每个连接都可以读取这些行。该行下面的两行目前已在您的交易中写入。在此连接中,所有四条线都可见。
如果另一个线程/连接/事务试图存储A-2,则在两个事务之一中会有一个例外(第一个可以提交事务,第二个不能)。
其他隔离级别可能会提前失败。但是不可能违反Unique-key约束。