我从未使用过SQL事务,就我而言,我知道我真的必须使用它们。我的应用程序的功能之一是将Excel文件转换为数据库。
因此,我从Excel中获取值,使用参数(要发送到SP)构建一个字符串数组,其中一些值将直接插入主表中,而另一些值将插入辅助表中,然后我将获得ID的ID来代替主表中的那些值。我的意思是说我有外键,这就是为什么要这样做。
所以我认为我做得很完美,但是没有交易。但是,如果在表中插入值时发生任何错误,则必须进行回滚。
因此,在此过程中,我正在使用5个存储过程,每个表一个。这些SP并非专用于此过程。它们将在应用程序中用于插入记录。
但是我需要在哪里使用交易的帮助。我应该在C#(应用程序端)还是在SQL Server(服务器端)中执行此操作?
现在,我正在使用C#中的SqlTransaction对象,它以某种方式起作用,因为如果执行回滚操作,他实际上会取消所有插入,但是我在事务中使用的ID不再可用。只有删除所有表并再次创建它们,这些ID才能再次可用。
因此,我认为我没有很好地使用该交易,这就是为什么我需要帮助来了解如何更好地使用该交易以及在何处使用该交易的原因。
我认为您在如何使用事务方面处于正确的轨道,问题是IDENTITY列的种子不会回滚。
我猜您正在使用MS SQL Server?要重置IDENTITY列而不重新创建表,可以使用DBCC CHECKIDENT。
DBCC CHECKIDENT (table_name, RESEED, 99);
这将重置种子,以便分配的下一个标识值将为100。当然,您必须在BEGIN TRANSACTION之前记录表的最高标识值。
仅在有单个编写器进程的情况下才使用此功能。在多作者的情况下,除非首先进行一些认真的表锁定,否则很可能会使事情变得井井有条。对于多位编写者,我认为您最好将其余的代码编写出来,这样可以接受“标识”列值中的“漏洞”。