事务-为什么需要事务
如,转账问题:
假定钱从A转到B,至少需要两步:
A的资金减少
然后B的资金相应增加
update bank set balance=balance-1000 where cid='0001'
update bank set balance=balance + 1000 where cid='0002'
--查看结果。
SELECT * FROM bank
注意约束:金额不能小于10
--事务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<span style=
"font-family: 微软雅黑, 'Microsoft YaHei'; font-size: 14px;"
>
create
table
bank
(
cId
char
(4)
primary
key
,
balance money,
--余额
)
alter
table
bank
add
constraint
CH_balance
check
(balance >=10)
go
--delete from bank
insert
into
bank
values
(
'0001'
,1000)
insert
into
bank
values
(
'0002'
,10)
go
update
bank
set
balance=balance-1000
where
cid=
'0001'
update
bank
set
balance=balance + 1000
where
cid=
'0002'
</span>
|
什么是事务(Transaction)
事务:同生共死
指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)--也就是由多个sql语句组成,必须作为一个整体执行
这些sql语句作为一个整体一起向系统提交,要么都执行、要么都不执行
语法步骤:
开始事务:BEGIN TRANSACTION 开启事务
事务提交:COMMIT TRANSACTION --提交操作
事务回滚:ROLLBACK TRANSACTION --取消操作
判断某条语句执行是否出错:
全局变量@@ERROR;
@@ERROR只能判断当前一条T-SQL语句执行是否有错,为了判断事务中所有T-SQL语句是否有错,我们需要对错误进行累计;
例:SET @errorSum=@errorSum+@@error
事务的ACID特性:
事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务。
原子性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。
隔离
由并发事务所作的修改必须与任何其他并发事务所作的修改隔离。事务识别数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是第二个事务修改它之后的状态,事务不会识别中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
SET IMPLICIT_TRANSACTIONS { ON | OFF }
如果设置为 ON,SET IMPLICIT_TRANSACTIONS 将连接设置为隐式事务模式。如果设置为 OFF,则使连接恢复为自动提交事务模式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<span style=
"font-family: 微软雅黑, 'Microsoft YaHei'; font-size: 14px;"
>
select
*
from
bank
--使用事务
begin
transaction
declare
@error
int
set
@error = 0
update
bank
set
balance=balance-1000
where
cid=
'0001'
set
@error = @error + @@error
update
bank
set
balance=balance + 1000
where
cid=
'0002'
set
@error = @error + @@error
if @error != 0
rollback
transaction
else
commit
transaction
go
select
*
from
bank</span>
|
参考:雪维网 http://xuevi.com