咋确保数据库的某条唯一数据

分成2个表
1、学生表
2、班长表(班级ID + 学生ID,建立唯一约束)

■网友
可以在权限里做,班长本身也是一个角色。针对性设计的话可以用唯一索引。

■网友
方案1,不错。我也经常这么用。但实际上这是MySQL的一个特性。就是唯一索引列中NULL值不计算唯一约束。如果你用Oracle,就会有一个所谓条件唯一索引的东东,就是如果满足一个条件才做唯一约束。大概语法是这样的。
CREATE UNIQUE INDEX uniq_master ON student((CASE WHEN is_master = \u0026#39;1\u0026#39; THEN is_master ELSE null END));
方案2,也可以用。但是你要保证你的隔离级别会有gap锁。否则会出现并发插入/更改的问题,得到多于1个master。最简单的就用Serilaziable隔离级别。为了避免性能损耗,你可以设置只有这一个事务用Serializable。

如果坚决不用Serializable,还有一个招数,叫做“物化冲突”,把这件事情做一张表表示一个锁。
create table master_assign_lock ( lock char(1) default \u0026#39;1\u0026#39;);在做设定班长时,先对这个锁 select ... for update然后再进行设置班长的操作。但是这样做会很丑,把业务代码和约束混到了一起。所以建议作为最后的考虑。

顺带提一句,如果你用的是Postgres,那的RC和Serializable隔离级别的实现不是基于锁,而是Serializable Snapshot Isolation,这个机制会帮你做“事务提交时,提交依赖的事务是不是被别的事务改过的“的check。如果是,事务会提交失败。
具体可以看我的 文章,中“SSI和基于SSI实现的Serializable“的描述
数据库事务、隔离级别和锁 【咋确保数据库的某条唯一数据】


    推荐阅读