Python应用程序,标准Web应用程序。
如果某个特定请求被错误执行了两次,则第二个请求将尝试插入一个已存在主键的行。
处理它的最明智的方法是什么。
a)执行查询以检查主键是否已存在并在python应用程序中执行检查和错误处理
b)让SQL引擎拒绝插入约束失败并使用异常处理在应用程序中处理它
从速度的角度来看,似乎失败的请求将花费与成功的请求相同的时间,使得b更快,因为它只有一个请求而不是两个。
但是,当您考虑使用只读数据库从属数据库和表写入锁等事情时,事情会因为我在扩展标准SQL数据库方面的经验而变得模糊。
答案 0 :(得分:2)
最好的选择是(b),几乎从任何角度来看。正如评论中所提到的,存在一个多线程问题。这意味着选项(a)甚至不能保护数据完整性。这就是您希望数据完整性检查在数据库中而不是在数据库之外的主要原因。
还有其他原因。考虑表现。将数据传入和传出数据库需要付出努力。有多个级别的协议和数据准备,更不用说来自数据库服务器的往返,顺序通信。一个呼叫有一个这样的开销单位。两个电话有两个这样的单位。
确实,在某些情况下,查询失败可能需要很长的清理时间。但是,对唯一值的约束检查是索引中的单个查找,它既快速又具有最小的清理开销。与从应用程序运行查询的开销相比,处理错误的额外开销应该很小 - 两者都很小,一个要小得多。
如果您有一个查询加载,其中插入在比较方面非常罕见,那么您可以考虑在应用程序中进行检查。使用SELECT
而不是使用INSERT
检查是否存在某些内容可能要快一点。但是,除非您的查询加载对每个实际插入进行了很多此类检查,否则我会检查数据库并继续处理其他问题。
答案 1 :(得分:1)
后者在任何情况下都需要做和处理,因此我没有看到查询重复项有多大价值,除了事先显示用户信息 - 例如报告"此用户名已经被取消,请选择其他用户名"当用户仍在填写表格时。