使用 TVP 插入行是否应该在事务中?

Should inserting rows with TVP be in transaction?

我有一个 TVP 类型 List_Of_Items,并且想一次插入多行,所以我的选择是使用带有 TVP 参数的存储过程,如下所示。这样的插入是否安全,我可以摆脱交易吗?或者它有潜在的危险,因为插入物可能会在中间断裂,所以必须进行交易?

CREATE PROC Insert_Order_With_Details 
(
     @Items List_Of_Items
) 
AS
BEGIN
    BEGIN TRANSACTION
        INSERT INTO OrderDetails (OrderId, CustomerId, ItemId, Quantity)
            SELECT @OrderID, @CustomerID, ItemID, Quantity
            FROM @Items
    COMMIT
END

不,只有当您有多个 SQL 语句并希望 运行 作为原子操作时,才应使用显式事务。

隐式事务中的单个 SQL 语句 运行,因此任何单个语句都可以成功完成或完全失败 - 你永远不会有一个 insert...select 在中间失败select 操作并仅插入部分行。