【发布时间】:2015-06-16 20:41:53
【问题描述】:
我有一个带有 xml 参数的存储过程。为简单起见,假设 xml 代表汽车的集合。集合中的每个元素都代表一辆汽车,并具有诸如识别号和制造商之类的详细信息。存储过程的目标是将数据插入数据库。数据库模式已标准化,因此有一个制造商表和一个汽车表。许多汽车可以有相同的制造商。
架构如下所示:
在处理 xml 时,我需要插入 xml 中列出的不在数据库中的制造商,然后插入 xml 中列出的不在数据库中的汽车。
- 将唯一的制造商从 xml 插入到 Manufactures 表中
- 将记录从 xml 插入到 cars 表中,加入到制造商名称上的制造表中,以获得适当的制造商 ID。
在第 1 步和第 2 步之间,用户或某些其他进程可能会删除制造记录,这样即使我插入了制造记录,或者我需要的制造记录已经存在,当我开始插入汽车记录时所需的制造记录不再存在。
如何防止这种情况发生?我可以在一个事务中完成这一切,这将锁定我插入的制造商记录直到提交,但我如何才能锁定我需要的已经存在的记录?
【问题讨论】:
-
将两个插入都放在一个事务中。问题解决了。
-
引入锁并不是一个简单的决定。如果您不希望有很多冲突,您可以随时检查第二次插入的结果,如果第二次插入失败,则回滚第一次。您可能需要再次执行此操作,但它比死锁和锁引入的其他开销要好。
标签: sql-server sql-server-2008 transactions