把语句组入到事务中

假如你想在你的网站上出售商业卡。首先，为了做到这一点，你必须创建两个表格，一个表格包含了要付帐的信用卡帐号的列表。另外一个表则包含了定购产品的定单的列表。无论何时，当一个客户在访问你的站点时定购了商业卡，你需要把信息同时添入到两个表格中。

现在假设有一个访问你站点的客户定购了商业卡。首先该客户的信用卡号添加到信用卡表中。然而就在这一时刻。你Web服务器的硬盘驱动器突然坏了。该客户的定单并没有保留到产品定单表中。这就会使事情变得很糟糕。来访者的信用卡为商业卡付了账，但是确没有收到定购的产品。此时定购的客户肯定会对你的行为感到生气。你该怎样阻止该事情的发生呢？

在本节中，将会用到下面的三个语句：BEGIN TRANSACTION，COMMIT TRANSACTION和ROLLBACK TRANSACTION。一个事务（transaction）是一组语句，这组语句要么全部执行，要么全部不执行。下面就是如何使用这些语句的一个简单的例子：

BEGIN TRANSACTION

INSERT credit_cards (username,ccnumber)

VALUES(

‘Andrew Jones’,’5555-55-555-55-5555’)

INSERT orders(username) VALUES (

‘Andrew Jones’)

COMMIT TRANSACTION

在该例子中,我们使用BEGIN TRANSACTION 和COMMIT TRANSACTION来定义事务块.在该块中显示的语句只有在执行COMMIT TRANSACTION后才发生效用。假如在到达该语句之前的任一点发生了错误，所有在该事务中的语句都不会发生效用。比如在上面的例子中，如果你的硬盘在执行完第一个INSERT语句而在第二个语句之前发生了硬盘错误。没有数据会插入到任一表中。第一个语句会倒转回去，并不会有如何效果。

你可以使用ROLLBACK TRANSACTION语句来显式地倒转一个事务，如下所示：

BEGIN TRANSACTION

INSERT credit_cards(username,ccnumber)

VALUES(

‘Andrew Jones’,’5555-55-555-55-5555’)

INSERT orders(username) VALUES(

‘Andrew Jones)

IF DATENAME(dw,GETDATE())=

”Tuesday”

ROLLBACK TRANSACTION

ELSE

COMMIT TRANSACTION

在上面的例子中，事务在除了星期二外的每天都递发。假如一个星期中的某一天刚好是星期二，则事务就会倒转回去，不会产生任何效果。换句话说，在在星期二不会收到任何新的定单。

注意

在和触发器一起使用时，ROLLBACK TRANSACTION命令特别有用。参看下面的“结合触发器和事务过程”部分。