我有一个应用程序,我必须在数组中插入SQL Server 2008,以N个元组为一组,并且必须插入所有元组才能成功插入,我的问题是如何插入这些元组和如果有人失败,我会进行回滚以消除所有正确插入的元组。
由于
答案 0 :(得分:3)
在SQL Server上,您可能会考虑执行bulk insert。
答案 1 :(得分:2)
从.NET开始,您可以使用SQLBulkCopy。
表值参数(TVP)是第二条路线。在insert语句中,在目标表上使用WITH (TABLOCK)
以进行最少的日志记录。例如:
INSERT Table1 WITH (TABLOCK) (Col1, Col2....)
SELECT Col1, Col1, .... FROM @tvp
将其包装在一个存储过程中,该存储过程将@tvp公开为参数,添加一些事务处理,并从您的应用程序中调用此过程。
如果数据具有嵌套结构,您甚至可以尝试将数据作为XML传递,并将其分解为数据库端的表。
答案 2 :(得分:1)
您应该查看交易。这是一个很好的intro article讨论回滚等等。
答案 3 :(得分:1)
如果您直接从程序中插入数据,那么您需要的是交易。您可以直接在存储过程中或从使用您使用的任何语言编写的数据适配器中启动事务(例如,在C#中,您可能正在使用ADO.NET)。
插入所有数据后,如果出现错误,您可以提交事务或进行回滚。
有关创建,提交和回滚事务的一些详细信息,请参阅Scott Mitchell's "Managing Transactions in SQL Server Stored Procedures。
答案 4 :(得分:0)
对于MySQL,请查看LOAD DATA INFILE,它允许您从磁盘文件中插入。
另请参阅关于Speed of INSERT Statements的一般MySQL讨论。
有关更详细的答案,请提供一些有关您正在使用的软件堆栈的提示,以及一些源代码。
答案 5 :(得分:0)
您有两个相互竞争的利益,进行大型交易(性能低下,失败风险高)或快速导入(最好不要在一次交易中完成所有操作)。
如果要向表中添加行,则不要在事务中运行。如果您不喜欢第一轮的外观,您应该能够确定哪些行是新的并删除它们。
如果事务很复杂(每行影响几十个表等),那么在小批量交易中运行它们。
如果您必须在一个事务中运行大量数据导入,请考虑在数据库处于单用户模式时执行此操作,并考虑使用checkpoint关键字。