第五章 事务和游标

什么是事务?

1.在数据库的实际应用中,有时候要把包含有多个步骤的指令当作一个整体来运行。这个整体要么全部运行成功,要么全部运行失败,这就需要考虑事务。

2.事务(TRANSACTION)是由若干条T_SQL指令组成的作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,全部执行完成,要么全部撤销。

3.事务是一个不可分割的工作逻辑单元。

 

事务的特性

1.原子性(Atomicity):事务是一个完整的操作,各步操作是不可分的(原子的);要么都执行,要么都不执行,不存在只完成一部分的情况。

2.一致性(Consistency):当事务完成时,数据必须处于一致状态;在事务开始之前及完成之后,数据存储中的数据处于一致状态,处理期间可以不一致。

3.隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。

4永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性,即使出现系统故障也将一直保持。

事务的模式

一:显示事务

1.用户使用T-SQL明确定义开始和结束的事务

2.begin/commit/rollback/transaction

二:自动提交事务

1.sql server默认事务方式,能够自动执行并能自动回滚的事务

2.对数据进行删除/修改等操作时,出现错误,操作将会被自动取消

三:隐式事务

1.当事务提交或回滚后,自动开始的事务

 

 

游标

有些应用程序,不需要对查询得到的整个记录集进行访问,而只需要其中的一行或者少量的几行数据,或者希望对其进行处理时,就需要考虑游标

游标实际上是一中能从包括多条数据记录的结果集中每次提取一条记录的机制

使用游标,可以实现以下目标:

1.允许定位到结果集的特定行

2.从结果集的当前位置检索一行或多行数据

3.支持对结果集中当前位置的行进行修改

 

SQL Server支持的游标

一:T_SQL的游标

1.基于declare cursor语法,主要用于T_SQL脚本,存储过程和触发器中

2.在服务器上实现,由客户端发往服务器的T-SQL指令进行管理

二 :API游标

1.基于应用程序接口,在服务器上实现

三:客户端游标

1.通过在客户端高速缓存所有结果集行来实现

 

游标的基本操作

1:第五章 事务和游标

2:第五章 事务和游标

3:第五章 事务和游标

 

 

  语法结构
        --DECLARE  cursor_name                        --游标名
        --CURSOR [LOCAL | GLOBAL]                    --全局或局部的
        --[FORWARD ONLY | SCROLL]                    --游标滚动方式
        --[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]    --游标读取方式
        --FOR SELECT_statements                        --查询语句
        --[FOR UPDATE [OF Column_name[,….N]]]        --可更改字段

 

 

操作步骤如下:

/*--使用游标--*/
        --1.声明游标
            DECLARE bank_cursor
            CURSOR SCROLL
            FOR SELECT * FROM bank
            --FOR SELECT customerName,currentMoney FROM bank  --获取部分列

        --2.打开该游标
            OPEN bank_cursor

        --3.读取游标
            --定义个变量,用于存放游标中读取出来的值
            DEClARE @id int
            DECLARE @name CHAR(10)
            DECLARE @money MONEY
            --读取游标的第一条记录行,并存放在变量中
            FETCH FIRST FROM bank_cursor INTO @id,@name,@money
            
            --IF (@@fetch_status = 0)
            --BEGIN
            --    PRINT '账户名:' + @name + '    余额:' +  convert(VARCHAR,@money)
            --END
            --FETCH NEXT FROM bank_cursor INTO @id,@name,@money
            --IF (@@fetch_status = 0)
            --BEGIN
            --    PRINT '账户名:' + @name + '    余额:' +  convert(VARCHAR,@money)
            --END
            
            --循环读取游标中的记录
            PRINT '读取的数据如下:'
            WHILE (@@fetch_status = 0)
            BEGIN
                --用print输出读取的数据
                PRINT '账户名:' + @name + '    余额:' +  convert(VARCHAR,@money)
                --update bank set currentMoney = currentMoney+1000 where customerId = @id
                --读取下一条记录行
                FETCH NEXT FROM bank_cursor INTO @id,@name,@money
            END

        --4.读取完成后关闭游标
            CLOSE bank_cursor

        --5.释放游标
            DEALLOCATE bank_cursor