Sql 如果检测到问题,请稍后纠正。无论您选择什么隔离级别,以及您如何准确地更改表中的数据,都应使用(ListID,index)上的唯一索引强制执行最重要的约束-无重复项。唯一索引约束很容易实现,并且始终保持不变。删除记录时,降低Id大于已删除记录1的所有记录的I
Sql 如果检测到问题,请稍后纠正。无论您选择什么隔离级别,以及您如何准确地更改表中的数据,都应使用(ListID,index)上的唯一索引强制执行最重要的约束-无重复项。唯一索引约束很容易实现,并且始终保持不变。删除记录时,降低Id大于已删除记录1的所有记录的I,sql,postgresql,concurrency,transactions,acid,Sql,Postgresql,Concurrency,Transactions,Acid,如果检测到问题,请稍后纠正。无论您选择什么隔离级别,以及您如何准确地更改表中的数据,都应使用(ListID,index)上的唯一索引强制执行最重要的约束-无重复项。唯一索引约束很容易实现,并且始终保持不变。删除记录时,降低Id大于已删除记录1的所有记录的Id可能会在数据量较大时导致性能问题。我的建议是:。创建序列对象并将其用于新Id。不要对Id列进行“自动递增”,并使用序列手动管理它们。2.删除记录时,将Id大于已删除记录Id的记录的Id减少1。并在同一事务中将序列值减少1。3.使用“Read
如果检测到问题,请稍后纠正。无论您选择什么隔离级别,以及您如何准确地更改表中的数据,都应使用
(ListID,index)
上的唯一索引强制执行最重要的约束-无重复项。唯一索引约束很容易实现,并且始终保持不变。删除记录时,降低Id大于已删除记录1的所有记录的Id可能会在数据量较大时导致性能问题。我的建议是:。创建序列对象并将其用于新Id。不要对Id列进行“自动递增”,并使用序列手动管理它们。2.删除记录时,将Id大于已删除记录Id的记录的Id减少1。并在同一事务中将序列值减少1。3.使用“Read uncommitted”类型作为隔离级别。我警告您,如果您在UI上使用Id进行操作,在删除记录时更新Id,将给您带来巨大的操作问题。因为,其他人可以编辑另一条记录,因为它同时具有更大的Id值。@Gurcan我需要Id是持久的/顺序独立的,并且更希望它们是UUID而不是整数。所以id和index是独立的列。增加/减少记录索引对我来说不是问题,因为一个列的项目数不应该超过10个。所以,在基本设计中看起来还可以。索引顺序机制可以是我建议的方式。你同意吗?使用选择条件作为某种“模拟约束”的想法很聪明,我没有想到。不幸的是,唯一索引无法工作,因为列不是完全唯一的。我在两个写操作中移动/删除它们(首先移动邻接项,然后移动/删除项本身),操作1将导致违反此索引取决于dbms。唯一键约束可能在事务结束时得到检查(请参阅:),那么移动不会有问题。否则,扩展建议的select语句以检测相同的索引但不同的ID。更新将被发送到前端实时wia websocket,并且由于主板仅限于约20个用户,因此我不希望多个用户同时移动同一张卡时发生大量冲突。另一方面,前端呈现/ui逻辑依赖于一致的索引顺序,重复的索引或间隙可能导致未定义的行为。保证后端的一致性,然后让前端意识到可能存在的不一致性,这似乎更为清晰。在这种情况下,“可序列化”可能是多余的。尝试使用“可重复读取”,但同时,在服务器端(而不是数据库端)实现一些逻辑,以序列化在同一块板上完成的操作。一种方法是为每个“当前活动”板构造一个对象,然后在该对象上使用synchronized来阻止用户同时访问,从而序列化操作。另一种(可能更好)方法是使用某种队列机制,将操作序列化并返回websocket上的反馈。
| id | listId | index | title | ... |
| id | listId | index | title | ...
---------------------------------------------
| "item1" | "list1" | 0 | "title1" | ...
| "item2" | "list1" | 1 | "title2" | ...
| "item3" | "list1" | 2 | "title3" | ...
| "item4" | "list2" | 0 | "title4" | ...
| "item5" | "list2" | 1 | "title5" | ...