BEGIN TRANSACTION
INSERT INTO Customers(cust_id, cust_name)
VALUES('1000000010', 'Toys Emporium');
SAVE TRANSACTION StartOrder;
INSERT INTO Orders(order_num, order_date, cust_id)
VALUES(20100,'2001/12/1','1000000010');
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder;
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20100, 1, 'BR01', 100, 5.49);
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder;
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20100, 2, 'BR03', 100, 10.99);
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder;
COMMIT TRANSACTION
分析▼
这里的事务处理块中包含了4条INSERT
语句。在第一条INSERT
语句之后定义了一个保留点,因此,如果后面的任何一个INSERT
操作失败,事务处理最近回退到这里。在SQL Server中,可检查一个名为@@ERROR
的变量,看操作是否成功。(其他DBMS使用不同的函数或变量返回此信息。)如果@@ERROR
返回一个非0
的值,表示有错误发生,事务处理回退到保留点。如果整个事务处理成功,发布COMMIT
以保留数据。
提示:保留点越多越好
可以在SQL代码中设置任意多的保留点,越多越好。为什么呢?因为保留点越多,你就越能灵活地进行回退。