把语句组入到事务中
把语句组入到事务中
假如你想在你的网站上出售商业卡。首先,为了做到这一点,你必须创建两个表格,一个表格包含了要付帐的信用卡帐号的列表。另外一个表则包含了定购产品的定单的列表。无论何时,当一个客户在访问你的站点时定购了商业卡,你需要把信息同时添入到两个表格中。
现在假设有一个访问你站点的客户定购了商业卡。首先该客户的信用卡号添加到信用卡表中。然而就在这一时刻。你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命令特别有用。参看下面的“结合触发器和事务过程”部分。- · 利用缓存输出
- · 处理运行时间长的脚本以及内容大的主页
- · 处理主页的Headers
- · Active Server Pages是怎样工作的?
- · 在这章中
- · Form集合多个内容的处理显示
- · FORM的域对应多值的处理
- · Text Area的处理
- · 在这章中
- · 接受一个Query字段
- · 对Query字段进行Encode操作
- · 多参数以及多值的Query字段处理
- · 将QueryString集合所有参数一并输出
- · 什么情况下不要使用Query字段
- · 重引导用户到另一个主页位置
- · Active Server Pages是怎样工作的?
- · 在这章中
- · Sessions的使用和处理
- · Session的内容
- · Session结束的控制
- · Sessions事件
- · Session是怎样工作的
- · Active Server Pages是怎样工作的?
- · 在这章里面
- · 使用Application对象
- · 全部显示Application对象
- · Application事件
- · 聊天室应用
- · 创建聊天室主页
- · 修改Global
- · 创建信息发送页
- · 创建显示页
- · Application事件
- · Application对象
- · ObjectContext对象
- · Request对象
- · Response对象
- · Server对象
