SQL笔记四之事物处理机制

来源:互联网 发布:360浏览器 网络收藏夹 编辑:程序博客网 时间:2024/05/18 02:19
一.事务概念
    事务是一种机制、是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。因此事务是一个不可分割的工作逻辑单元。在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的。这特别适用于多用户同时操作的数据通信系统。例如:订票、银行、保险公司以及证券交易系统等。


二.四个属性:ACID特性
原子性Atomicity,
一致性Consistency,(SQL之前是什么状态,当结束了事务处理之后还是原来的状态)
隔离性Isolation,(事物之间的隔离开,当一个事物正在进行时是被处于锁定状态其它是无法对它进行操作的)
持久性Durability,(事物执行成功后,提交到磁盘保存就永久性)
即ACID特性。


三.创建事务
T-SQL中管理事务的语句:
1 开始事务: begin transaction
2 提交事务:commit transaction
3 回滚事务: rollback transaction


事务的状态:活动状态(初始状态),部分提交状态(事务执行完最后一条语句,实际输出可能临时驻留在内存中),提交状态(当数据库系统将事务中对数据的梗概完全写入磁盘时,写入事务日子一条信息),失败状态(事务不能正常执行,回滚),终止状态(事务已回滚并且数据库已被恢复到事务开始执行前的状态)。


事务分类:
1 显式事务:用begin transaction明确指定事务的开始。
2 隐性事务:打开隐性事务:set implicit_transactions on,当以隐性事务模式操作时,SQL Servler将在提交或回滚事务后自动启动新事务。无法描述事务的开始,只需要提交或回滚事务。
3 自动提交事务:SQL Server的默认模式,它将每条单独的T-SQL语句视为一个事务。如果成功执行,则自动提交,否则回滚。


事务与日志文件:日志文件是一个纪录数据库最新历史的文件,SQL Server会在系统恢复时使用日志文件(*.LDF)。三个重要的名词:ROLLBACK,SAVEPOINT,COMMIT。


ROLLBACK是当系统发生错误的时候,将部分完成的事务解除作用的功能够呢,它可以将一个事务恢复到某个SAVEPOINT或者十五开始时的状态。


SAVEPOINT是一个位置定义器,我们可以在一个十五内定义SAVEPOINT,当系统发生错误是将事务恢复至某个SAVEPOINT。


COMMIT是一个保存动作,它会将事务内所有对数据库的更新保存到磁盘上。COMMIT可以保证所有的改变将成为数据库的永久的一部分,而且会释放事务所使用的资源,例如:锁定机制(Lock)。


示例:张三转800元到李四帐户上。
  use stuDB
go
--创建帐户表bank--
if exists(select* from sysobjects where name='bank')
    drop table bank
create table bank
(
    customerName char(10),    --顾客姓名
    currentMoney money        --当前余额
)
go
/**//*--添加约束,帐户不能少于元--*/
alter table bank add
        constraint CK_currentMoney check(currentMoney>=1)
/**//*--插入测试数据--*/
insert into bank(customerName,currentMoney)
select '张三',1000 union
select '李四',1


select * from bank
go


/**//*--使用事务--*/
use stuDB
go
--恢复原来的数据
--update bank set currentMoney=currentMoney-1000 where customerName='李'
set nocount on    --不显示受影响的行数
print '查看转帐事务前的余额'
select * from bank
go


/**//*--开始事务--*/
begin transaction
declare @errorSum int    --定义变量,用于累计事务执行过程中的错误
/**//*--转帐--*/
update bank set currentMoney=currentMoney-800 where customerName='张三'
set @errorSum=@errorSum+@@error    --累计是否有错误
update bank set currentMoney=currentMoney+800 where customerName='李四'
set @errorSum=@errorSum+@@error --累计是否有错误


print '查看转帐事务过程中的余额'
select * from bank


/**//*--根据是否有错误,确定事务是提交还是回滚--*/
if @errorSum>0
    begin
        print '交易失败,回滚事务.'
        rollback transaction
    end
else
    begin
        print '交易成功,提交事务,写入硬盘,永久保存!'
        commit transaction
    end
go


print '查看转帐后的余额'
select * from bank
go
0 0
原创粉丝点击