SQL:事务(1)

摘自:http://blog.csdn.net/zerolsy/article/details/2123637

SQL事务
 
一、事务概念
    事务是一种机制、是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。因此事务是一个不可分割的工作逻辑单元。在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的。这特别适用于多用户同时操作的数据通信系统。例如:订票、银行、保险公司以及证券交易系统等。
 
二、事务属性
事务4大属性:
1   原子性(Atomicity):事务是一个完整的操作。
2   一致性(Consistency):当事务完成时,数据必须处于一致状态。
3   隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的。
4   持久性(Durability):事务完成后,它对于系统的影响是永久性的。
 
三、创建事务
T-SQL中管理事务的语句:
开始事务: begin transaction
提交事务:commit transaction
回滚事务: rollback transaction
 
事务分类:
显式事务:begin transaction明确指定事务的开始。
隐性事务:打开隐性事务:set implicit_transactions on,当以隐性事务模式操作时,SQL Servler将在提交或回滚事务后自动启动新事务。无法描述事务的开始,只需要提交或回滚事务。
自动提交事务:SQL Server的默认模式,它将每条单独的T-SQL语句视为一个事务。如果成功执行,则自动提交,否则回滚。
 
示例:张三转800元到李四帐户上。
 
 1  
 2 use stuDB
 3 go
 4 --创建帐户表bank--
 5 if exists(select* from sysobjects where name='bank')
 6     drop table bank
 7 create table bank
 8 (
 9     customerName char(10),    --顾客姓名
10     currentMoney money        --当前余额
11 )
12 go
13 /*--添加约束,帐户不能少于元--*/
14 alter table bank add
15         constraint CK_currentMoney check(currentMoney>=1)
16 /*--插入测试数据--*/
17 insert into bank(customerName,currentMoney)
18 select '张三',1000 union
19 select '李四',1
20 
21 select * from bank
22 go
23 
24 /*--使用事务--*/
25 use stuDB
26 go
27 --恢复原来的数据
28 --update bank set currentMoney=currentMoney-1000 where customerName='李'
29 set nocount on    --不显示受影响的行数
30 print '查看转帐事务前的余额'
31 select * from bank
32 go
33 
34 /*--开始事务--*/
35 begin transaction
36 declare @errorSum int    --定义变量,用于累计事务执行过程中的错误
37 /*--转帐--*/
38 update bank set currentMoney=currentMoney-800 where customerName='张三'
39 set @errorSum=@errorSum+@@error    --累计是否有错误
40 update bank set currentMoney=currentMoney+800 where customerName='李四'
41 set @errorSum=@errorSum+@@error --累计是否有错误
42 
43 print '查看转帐事务过程中的余额'
44 select * from bank
45 
46 /*--根据是否有错误,确定事务是提交还是回滚--*/
47 if @errorSum>0
48     begin
49         print '交易失败,回滚事务.'
50         rollback transaction
51     end
52 else
53     begin
54         print '交易成功,提交事务,写入硬盘,永久保存!'
55         commit transaction
56     end
57 go
58 
59 print '查看转帐后的余额'
60 select * from bank
61 go

PS:@@error的解释

 

更多:事务(2)

 

 

posted @ 2012-11-20 12:33  KeenLeung  阅读(358)  评论(0编辑  收藏  举报