假设我有一个带有帖子的表格,每个帖子都有它所属的主题的索引。我有一个带有主题的表,其中的整数字段表示此主题中的帖子数。创建新帖子时,我将该值增加1,然后删除帖子,将其值减少1。我这样做是为了在每次我需要统计某些主题的帖子数时都不查询数据库。但是我听说这种方法可能并不安全,并且表中的实际帖子数可能与存储值不匹配。是否有关于其安全性的ceratin信息?
没有交易,主要的问题是时间。考虑一个删除和两个用户:
Time User 1 User 2
1 count = count - 1
2 update finishes How many posts?
3 delete post Count returned
4 delete finishes
[请记住,诸如更新和删除之类的操作会花费有限的时间-即使它们一次全部生效。因此,用户2将获得错误的帖子数。这是比赛条件;可能不是您的应用程序中的问题。
交易通过确保重置计数和删除帖子均“同时”生效,从而解决了这个特定问题。
次要问题是数据质量。您的数据一致性检查不在数据库外部。有人可以直接进入数据库并说“哦,应该删除用户X的这些帖子”。然后,该用户可能会整体删除这些帖子-但“忘记”或不知道要更改关联的值。
这可能是个大问题。触发器应该可以解决此问题。