您的位置:新葡亰496net > 网络数据库 > 新葡亰496net5事务管理,案例代码

新葡亰496net5事务管理,案例代码

发布时间:2019-07-05 13:08编辑:网络数据库浏览(119)

    SQL Server 表的军管_有关业务操作的详解(案例代码)

    一、事务概念
        事务是一种体制、是一种操作类别,它包蕴了一组数据库操作命令,那组命令要么全体实践,要么全部不实行。由此事务是二个不可分割的办事逻辑单元。在数据库系统上举行出现操作时专门的学问是用作最小的主宰单元来利用的。那特别适用于多用户同期操作的数目通讯系统。举例:定票、银行、保障公司以及股票(stock)交易系统等。
    二、事务属性
    事务4大属性:
    1   原子性(Atomicity):事务是贰个整机的操作。
    2   一致性(Consistency):当事务完结时,数据必须处于同一状态。
    3   隔绝性(Isolation):对数据开始展览改换的有着并发事务是并行隔开的。
    4   漫长性(Durability):事务达成后,它对于系统的震慑是长久性的。
    三、创立工作
    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 事务:

    建议先读书存款和储蓄进度:SQL Server 存储进度

    My SQL Server →5事务管理

    1、概念

    事务(transaction):

      是将多少个修改语句组合在联合的情势,那么些措施中的全体语句只有全体举办技能精确完结功用。即要么全体推行,要么全部不实践。

     

     

    Ø 事务

     

    2、事务的acid属性:

    • 原子性:事务管理语句是叁个完好,不可分割。Atomicity--A

    • 一致性:事务处理前后数据库前后状态要一致。Consistency--C

    • 分割性(隔开性):四个业务并发管理互不困扰。Isolation--I

    • 长久性:事务管理达成后,数据库的变迁将不会再转移。Durability--D

    注意:在 MySQL 命令行的私下认可设置下,事务都以机动提交的,即推行 SQL 语句后就能即时实行 COMMIT 操作。由此要显式地开启二个事务务须使用命令 BEGIN 或 START TRANSACTION,大概实践命令 SET AUTOCOMMIT=0,用来禁用当前对话的自行提交。

    上边包车型地铁三种工作方法,附上代码

    1.  定义: 

    在数据库中偶尔须要把多少个步骤的下令当作贰个一体化来运转,这一个欧洲经济共同体依然全体得逞,要么全体退步,那就供给运用事务。

    .事务的概念

    3、MySQL事务隔绝等第

    事务隔离级别 脏读 不可重复读 幻读
    读未提交(read-uncommitted)
    不可重复读(read-committed)
    可重复读(repeatable-read)
    串行化(serializable)

     

    新葡亰496net5事务管理,案例代码。首先种:存款和储蓄进度

    作业是作为单个逻辑单元执行的一名目大多操作。 八个操作作为三个整体向系统提交,要么实行、要么都不举办,事务是贰个不可分割的劳作逻辑单元。那特别适用于多用户同一时常间操作的多少通讯系统。比如:购票、银行、保证集团以及股票(stock)交易系统等。

        1、 事务的特点

       事务机制将一组数据库操作命令当作四个完好无缺且独立的操作连串,即一组命令要么全体实践成功,要么都进行停业。

     4、SQL的业务情势

    业务分类:

    1. 显式事务:用begin transaction鲜明钦点职业的早先。
    2. 隐性事务:展开隐性事务:set implicit_transactions on,当以隐性事务形式操作时,SQL Servler将要交付或回滚事务后自动运维新职业。不可能描述事务的起初,只要求交给或回滚事务。
    3. 自行提交业务:SQL Server的私下认可形式,它将每条单独的T-SQL语句视为二个作业。如果成功实行,则自动提交,不然回滚。
    create proc proc_zhuanzhang
    @toNameID int,--接收转账的账户
    @fromNameID int,--转出自己的账户
    @momeys int --转账的金额
    as
    begin tran tran_money   --开始事务
    declare @tran_error int;
    set @tran_error = 0;
        begin try
            update a set [money] = [money]-@momeys where id = @fromNameID;
            set @tran_error = @tran_error @@ERROR;
            --测试出错代码,看看张三的钱减少,李四的钱是否会增加
            --set @tran_error = 1;
    
            update a set [money] = [money] @momeys where id = @toNameID;
            set @tran_error = @tran_error @@ERROR;
        end try
    
    begin catch
        PRINT '出现异常,错误编号:'   convert(varchar,error_number())   ',错误消息:'   error_message()
        SET @tran_error = @tran_error   1
    end catch
    
    IF(@tran_error > 0)
        BEGIN
            --执行出错,回滚事务
            ROLLBACK TRAN;
            PRINT '转账失败,取消交易!';
        END
    ELSE
        BEGIN
            --没有异常,提交事务
            COMMIT TRAN;
            PRINT '转账成功!';
        END
    

     

            事务有许多条T-SQL指令组成,何况有着的一声令下今早二个全体提交给数据库系统,实行时,那组命令要么全体推行到位,要么全体撤回。因而,事务是二个不可分割的逻辑单元。

    1.作业的作用:要么全部操作全体成就,要么全数操作全部不奉行。

     4.1显示事务

     T-SQL中处监护人务的话语:
      1 初叶作业: begin transaction
      2 交付业务:commit transaction
      3 回滚事务: rollback transaction

     案例代码:

    begin transaction
    insert into dept  values(100,'陈浩','男',19)
    save transaction sp1;
    insert into dept  values(101,'erer','男',9)
    rollback transaction sp1;
    commit transaction;
    --执行过程中插入第二条语句后,事务回滚到第二条数据之前,也就是第二条动作被撤销后,
    --最后提交事务后,表中只有一条数据。
    

    C# 代码调用存款和储蓄进程

    1. 事业必须具有的天性: 

            事务有4个本性:原子性(Atomicity)、一致性(Consistency)、隔开性(Isolation)以及长久性(Durability),也称作职业的ACID属性。

    2.怎么着是事情

    4.2隐式事务

    拉按钮闭隐式事务的格局:

    SET IMPLICIT_TRANSACTIONS ON/OFF;
    
    set implicit_transactions on;
    insert into dept values(101,'erer','男',9)
    rollbac
    
    protected void btnzz_Click(object sender, EventArgs e)
            {
                SqlConnection conn = new SqlConnection(@"Data Source=.;database=oa2010;uid=sa;pwd=sa");
                SqlCommand cmd = new SqlCommand("proc_zhuanzhang",conn);
                cmd.CommandType = CommandType.StoredProcedure;
                conn.Open();
                SqlParameter prar = new SqlParameter();//传递参数
                cmd.Parameters.AddWithValue("@toNameID", 13);//张三
                cmd.Parameters.AddWithValue("@fromNameID", 14);//李四
                cmd.Parameters.AddWithValue("@momeys", Convert.ToInt32(TextBox1.Text));
                cmd.Parameters.Add("@return", "").Direction = ParameterDirection.ReturnValue;//获取存储过程的返回值
                cmd.ExecuteNonQuery();
    
                string value = cmd.Parameters["@return"].Value.ToString();//把返回值赋值给value
                if (value == "0")
                {
    
                    Label1.Text = "转账成功";
    
                }
    
                else
                {
                    Label1.Text = "转账失败";
    
                }
    
            }
    
     
    

       1) 原子性:  Atomicity  :事务是二个完好的操作, 个成分是不足再分的。事务中因故成分必须作为二个完好无缺提交或回滚。如若第十五中学其他因素战败,则整个业务将退步。

    原子性:事务内的富有专门的工作可能全体完毕,要么全体不完了,不设有独有局地实现的处境。

         数据库中的事务是一种体制,种种事务时三个单独的事业单元,它富含了一组数据库操作命令,且这组命令要么施行,要么都不施行,因而事务时三个不可分割的办事逻辑单元。

     

       2)一致性: Consistency: 当事务落成时,数据必须处于同样状态。

    一致性:事务内的下一场操作都不可能违反数据库的下一场约束或准则,事务完结时有内部数据结构都不可能不是不错的。

    1. 事务的习性:

    二、第三种办法:ADO.net

       3)隔开性: Lsolation: 对数据开始展览改换的有着并发事务是互为隔断的,它不以任何措施依赖或影响另外事情。

    隔离性:事务间接是并行隔断的,如若有四个业务对同八个数据库进行操作,比方读取表数据。任何贰个职业看到的具有内容照旧是别的事情落成以前的图景,要么是其它职业完结以往的意况。三个业务不恐怕蒙受另一个事务的中间状态。

    ①原子性:事务的一一要素是不可分的。

    protected void Button1_Click(object sender, EventArgs e)
            {
                SqlConnection con = new SqlConnection(@"Data Source=.;database=oa2010;uid=sa;pwd=sa");
                con.Open();
                SqlTransaction tran = con.BeginTransaction();//先实例SqlTransaction类,使用这个事务使用的是con 这个连接,使用BeginTransaction这个方法来开始执行这个事务
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = con;
                cmd.Transaction = tran;
                try
                {
                    //在try{} 块里执行sqlcommand命令,
                    cmd.CommandText = "update a set money=money-"   Convert.ToInt32(TextBox1.Text)   " where id=13";//张三id
                    cmd.ExecuteNonQuery();
                    cmd.CommandText = "update a set money=money "  Convert.ToInt32(TextBox1.Text)  " where id=14";//李四id
                    cmd.ExecuteNonQuery();
                    tran.Commit();//如果两个sql命令都执行成功,则执行commit这个方法,执行这些操作
                    Label1.Text = "添加成功";
                }
                catch
                {
                    Label1.Text = "添加失败";
                    tran.Rollback();//如何执行不成功,发生异常,则执行rollback方法,回滚到事务操作开始之前;
                }
            }
    

       4)长久性: 不管系统是或不是发生了故障,事务处理的结果都以永恒性的。

    持久性:事务达成以后,它对数据库系统的影响是长久的,纵然是系统错误,重新起动系统后,该事情的结果仍然还是留存。

    ②一致性:事务完结时必须使具有的多少都保持一致。

     

     

        2、 事务的形式

    ③隔开分离性:对数据开始展览改造的持有并发事务时互相隔离的。

    代码附上:政工三种方法下载

    1. 何以实行工作:

            a、 呈现事务

    ④持久性:只要职业成功交付今后,就无法重新回滚到提交前的情形。

        1)开首业务:  begin  transaction

            展现事务就是用户采用T-SQL明确的概念事务的开头(begin transaction)和付出(commit transaction)或回滚事务(rollback transaction)

      

        2)  提交业务: commit transaction

            b、 自动提交业务

    ·事务的利用

        3)  回滚事务: rollback transaction

            自动提交业务是一种能够自行试行并能自动回滚事务,这种办法是T-SQL的私下认可事务格局。比方在剔除贰个表记录的时候,假如那条记下有主外键关系的时候,删除就能受主外键约束的震慑,那么这几个删除就能够裁撤。

    1.创办工作:

     

            能够安装工作步向隐式方式:set implicit_transaction on;

    ①起初作业:BEGIN TRANSACTION

    1. 工作分类

            c、 隐式事务

    ②交到业务:COMMIT TRANSACTION

        1) 展现事务: 用begin transaction 分明钦定业务的初步

            隐式事务是指当事务提交或回滚后,SQL Server自动起初业务。因而,隐式事务不需求利用begin transaction显示初阶,只需直接失业提交业务或回滚事务的T-SQL语句就可以。

    ③回滚事务:ROLLBACK TRANSACTION

        2) 隐式事务: 通过设置 set implicit_transactions on 语句,将隐式事务情势设置为展开。当以隐式事务情势操作时,SQlServer将要付出或回滚事务后活动运维新业务。无需描述每种事情的起来,只要付给或回滚各类职业就可以。

            使用时,要求安装set implicit_transaction on语句,将隐式事务格局张开,下五个语句会运行贰个新的事物,再下贰个口舌又将运转二个新业务。

    分类:

        3) 自动提交业务: 那是SQL Server的暗中同意形式,它将每条单独的T-SQL语句视为三个政工。借使成功实行,则自动提交。要是不当,则自动回滚。

        3、 事务管理

        突显事务:用begin transaction明显钦命工作的启幕,后续的T-SQL语句都以多少个总体。

     

            常用T-SQL事务语句:

        隐式事务:使用Set implicit_transaction on语句,将隐式事务设置为张开。

    1. 示例

            a、 begin transaction语句

        自动提交业务:是SQL Server d的暗许情势,它将每条单独的T-Sql语句视为三个作业,假若成功实行则自动提交,如若失利,则自动回滚。

       XXXXXX  业务逻辑

            开首事务,而@@trancount全局变量用来记录事务的数量值加1,能够用@@error全局变量记录奉行进度中的错误音信,如果未有不当能够平昔提交业务,有错误能够回滚。

    常用的是显得事务,它显明钦点业务开头的界线。事务富含的语句越少越好,非亲非故的言辞不要放在职业里,如变量的扬言和赋值。

     

            b、 commit transaction语句

    2.成立工作的规范:

      begin transaction  --初叶业务

            回滚事务,表示二个隐式或显示的事情的利落,对数据库所做的改造标准生效。并将@@trancount的值减1;

    ①业务要硬着头皮的轻便。

       declare @error  int  --定义变量,积存事务实践进度中的错误

            c、 rollback transaction语句

    ②在事情中拜谒的数据量要硬着头皮最少。

       set @error = 0

            回滚事务,试行rollback tran语句后,数据会回滚到begin tran的时候的情事

    ③浏览数据时尽量不要展开专业。

       ----- 施行语句1

        4、 事务的身体力行

    ④在事务管理时期尽量不要诉求用户输入。

        set  @error = @error @@error  --储存错误

    --开始事务
    
    begin transaction tran_bank;
    
    declare @tran_error int;
    
        set @tran_error = 0;
    
        begin try
    
            update bank set totalMoney = totalMoney - 10000 where userName = 'jack';        
    
            set @tran_error = @tran_error   @@error;
    
            update bank set totalMoney = totalMoney   10000 where userName = 'jason';
    
            set @tran_error = @tran_error   @@error;
    
        end try
    
        begin catch        
    
            print '出现异常,错误编号:'   convert(varchar, error_number())   ', 错误消息:'   error_message(); 
    
            set @tran_error = @tran_error   1;
    
        end catch
    
    if (@tran_error > 0)
    
        begin
    
            --执行出错,回滚事务
    
            rollback tran;
    
            print '转账失败,取消交易';
    
        end
    
    else
    
        begin
    
            --没有异常,提交事务
    
            commit tran;
    
            print '转账成功';
    
        end
    
    go
    

     

       ---- 试行语句2

    Ø 异常

    .在存款和储蓄进程中利用工作

        set  @error = @error @@error  --积累错误

         在程序中,有时候达成都部队分Transact-SQL会产出谬误、非凡信息。假设大家想和睦管理那么些相当新闻的话,必要手动捕捉那些新闻。那么大家能够运用try catch完毕。

    1.接纳专门的学问的注意事项:

       ------

    TRAV4Y…CATCH 构造满含两有个别:一个 T宝马X3Y 块和一个 CATCH 块。要是在 T途达Y 块中所包罗的 Transact-SQL 语句中检查评定到不当条件,调节将被传送到 CATCH 块(可在此块中拍卖该错误)。

    ①在各个操作之后,都有检查@@error 或 @@rowcount的值。

       

         CATCH 块管理该非常错误后,调节将被传送到 END CATCH 语句前面的第一个Transact-SQL 语句。要是 END CATCH 语句是储存进程或触发器中的最终一条语句,调整将赶回到调用该存款和储蓄过程或触发器的代码。将不实践T奥迪Q7Y 块中生成错误的说话后边的 Transact-SQL 语句。

    ②当贰个事情截至后,紧跟在职业之后的T-sql代码还足以继续试行,不过出错后就无法再回滚事务了。

       --判断

         如若 TKoleosY 块中绝非错误,调整将传递到事关的 END CATCH 语句后紧跟的言语。要是 END CATCH 语句是储存进程或触发器中的最终一条语句,调控将传递到调用该存款和储蓄进度或触发器的讲话。

    ③早已交由截至的政工将会将数据标准写入数据库。

       if  @error <> 0  --有误

         TKugaY 块以 BEGIN THighlanderY 语句开端,以 END T君越Y 语句结尾。在 BEGIN T奥迪Q5Y 和 END T奥迪Q3Y 语句之间能够钦赐贰个或四个 Transact-SQL 语句。CATCH 块必须紧跟 T奥迪Q5Y 块。CATCH 块以 BEGIN CATCH 语句伊始,以 END CATCH 语句结尾。在 Transact-SQL 中,每种 T凯雷德Y 块仅与四个 CATCH 块相关联。

    ④在贰个职业正在进行时,如产生停电等意外,则再下一次重启系统是该事务会自动回滚。

         begin

         # 错误函数

    ⑤在职业例发生错误使得业务不可能奉行下去,事务也会活动回滚。

        print  '回滚事务'

    TRY...CATCH 使用错误函数来捕获错误信息。
    
        ERROR_NUMBER() 返回错误号。
    
        ERROR_MESSAGE() 返回错误消息的完整文本。此文本包括为任何可替换参数(如长度、对象名称或时间)提供的值。
    
        ERROR_SEVERITY() 返回错误严重性。
    
        ERROR_STATE() 返回错误状态号。
    
        ERROR_LINE() 返回导致错误的例程中的行号。
    
        ERROR_PROCEDURE() 返回出现错误的存储过程或触发器的名称。
    

    ⑥无法回滚的语句不能再事业中动用。

               rollback  transaction

    示例

    例:

         end

    --错误消息存储过程
    
    if (object_id('proc_error_info') is not null)
    
        drop procedure proc_error_info
    
    go
    
    create proc proc_error_info
    
    as
    
        select 
    
            error_number() '错误编号',
    
            error_message() '错误消息',
    
            error_severity() '严重性',
    
            error_state() '状态好',
    
            error_line() '错误行号',
    
            error_procedure() '错误对象(存储过程或触发器)名称';
    
    go
    

       create database 创制数据库

       else  

        # 示例:用极度处理错误音讯

       alter database  修改数据库

         begin

    --简单try catch示例
    
    begin try
    
        select 1 / 0;
    
    end try
    
    begin catch
    
        exec proc_error_info; --调用错误消息存储过程
    
    end catch
    
    go
    

       drop database   删除数据库

        print  '提交事务'

    # 示例:至极能管理的错误消息

     

               commit transaction

    --
    
    --简单try catch示例,无法处理错误
    
    begin try
    
        select * * from student;
    
    end try
    
    begin catch
    
        exec proc_error_info;
    
    end catch
    
    go
    
    --
    
    --简单try catch示例,不处理错误(不存在的表对象)
    
    begin try
    
        select * from st;
    
    end try
    
    begin catch
    
        exec proc_error_info;
    
    end catch
    
    go
    
    --
    
    --异常处理,能处理存储过程(触发器)中(不存在表对象)的错误信息
    
    if (object_id('proc_select') is not null)
    
        drop procedure proc_select
    
    go
    
    create proc proc_select
    
    as
    
        select * from st;
    
    go
    
    begin try
    
        exec proc_select;
    
    end try
    
    begin catch    
    
        exec proc_error_info;
    
    end catch
    
    go
    

    .事务的隔开分离品级

         end

    老大无法处理编写翻译期的荒谬,如语法错误。以及重编写翻译产生一些称号对象得不到准确深入分析的时候所出现的失实。

    ①Read uncommitted:不隔开数据,纵然专门的工作正在选拔的还要,别的作业也能同临时间修改或删除该多少。

      

         # 示例:无法提交的业务

    ②Read committed:分裂意读取未有交到的多少

     

    --创建临时用表
    
    if (object_id('temp_tab', 'u') is not null)
    
        drop table temp_tab
    
    go
    
    create table temp_tab(
    
        id int primary key identity(100000, 1),
    
        name varchar(200)
    
    )
    
    go
    
     
    
    begin try
    
        begin tran;
    
        --没有createTime字段
    
        alter table temp_tab drop column createTime;
    
        commit tran;
    
    end try
    
    begin catch
    
        exec proc_error_info;--显示异常信息
    
        if (xact_state() = -1)
    
        begin
    
            print '会话具有活动事务,但出现了致使事务被归类为无法提交的事务的错误。'
    
                  '会话无法提交事务或回滚到保存点;它只能请求完全回滚事务。'
    
                  '会话在回滚事务之前无法执行任何写操作。会话在回滚事务之前只能执行读操作。'
    
                  '事务回滚之后,会话便可执行读写操作并可开始新的事务。';
    
        end
    
        else if (xact_state() = 0)
    
        begin
    
            print '会话没有活动事务。';
    
        end
    
        else if (xact_state() = 1)
    
        begin
    
            print '会话具有活动事务。会话可以执行任何操作,包括写入数据和提交事务。';
    
        end
    
    end catch
    
    go
    

    ③Repeatable Read:子事务中锁定所读取的数量不让比人修改和删除。

       

    # 示例:管理特别日志音信

    ④Snapshot:快速照相隔开分离,可认为读取数据的政工提供所需数据的壹个已交付的本子,因而写入数据的作业阻塞不会读取数据的作业。

        

    --
    
    ---异常、错误信息表
    
    if (object_id('errorLog', 'U') is not null)
    
        drop table errorLog
    
    go
    
    create table errorLog(
    
        errorLogID int primary key identity(100, 1),    --ErrorLog 行的主键。
    
        errorTime datetime default getDate(),            --发生错误的日期和时间。
    
        userName sysname default current_user,            --执行发生错误的批处理的用户。
    
        errorNumber int,                                --发生的错误的错误号。
    
        errorSeverity int,                                --发生的错误的严重性。
    
        errorState int,                                    --发生的错误的状态号。
    
        errorProcedure nvarchar(126),                    --发生错误的存储过程或触发器的名称。
    
        errorLine int,                                    --发生错误的行号。
    
        errorMessage nvarchar(4000)
    
    )
    
    go
    
    --
    
    --存储过程:添加异常日志信息
    
    if (object_id('proc_add_exception_log', 'p') is not null)
    
        drop proc proc_add_exception_log
    
    go
    
    create proc proc_add_exception_log(@logId int = 0 output)
    
    as
    
    begin
    
        set nocount on;
    
        set @logId = 0;
    
        begin try
    
            if (error_number() is null)
    
                return;
    
    
    
            if (xact_state() = -1)
    
            begin
    
                print '会话具有活动事务,但出现了致使事务被归类为无法提交的事务的错误。'
    
                      '会话无法提交事务或回滚到保存点;它只能请求完全回滚事务。'
    
                      '会话在回滚事务之前无法执行任何写操作。会话在回滚事务之前只能执行读操作。'
    
                      '事务回滚之后,会话便可执行读写操作并可开始新的事务。';
    
            end
    
            else if (xact_state() = 0)
    
            begin
    
                print '会话没有活动事务。';
    
            end
    
            else if (xact_state() = 1)
    
            begin
    
                print '会话具有活动事务。会话可以执行任何操作,包括写入数据和提交事务。';
    
            end
    
    
    
            --添加日志信息
    
            insert into errorLog values(getDate(), 
    
                current_user, error_number(), 
    
                error_severity(), error_state(), 
    
                error_procedure(), 
    
                error_line(), error_message());
    
            --设置自增值
    
            select @logId = @@identity;
    
        end try
    
        begin catch
    
            print '添加异常日志信息出现错误';
    
            exec proc_error_info;--显示错误信息
    
            return -1;
    
        end catch
    
    end
    
    go
    
    --
    
    ---处理异常信息示例
    
    declare @id int;
    
    begin try
    
        begin tran;
    
        --删除带有外键的记录信息
    
        delete classes where id = 1;
    
        commit tran;
    
    end try
    
    begin catch
    
        exec proc_error_info;--显示错误信息
    
        if (xact_state() <> 0)
    
        begin
    
            rollback tran;
    
        end
    
        exec proc_add_exception_log @id output
    
    end catch
    
    select * from errorLog where errorLogID = @id;
    
    go
    

    ⑤Serializable:将事务所要用到的数据表全体锁定,分歧意其余业务增添、修改和删除数据。

    Ø 游标

     

         游标能够对贰个select的结果集实行管理,或是不需求任何管理,就能够重回一个对记录集进行管理以往的结果。

    SQL Server 5事务管理 .事务的概念 事务机制将一组数据库操作命令当作三个整机且独立的操作类别,即一组命令要么全部推行成功,要么都...

         1、游标实际上是一种能从多条数据记录的结果聚焦每一次提取一条记下的建制。游标能够成功:

              # 允许定位到结果聚焦的一定行

              # 从结果集的当下地点检索一行或多行数据

              # 援助对结果聚焦当前地方的张开改造

         由于游标是将记录集举行一条条的操作,所以这么给服务器扩展肩负,一般在操作复杂的结果集的景况下,才使用游标。SQL Server 2007有三种游标:T-SQL游标、API游标、客户端游标。

         2、游标的基本操作

              游标的基本操作有定义游标、展开游标、循环读取游标、关闭游标、删除游标。

         A、 定义游标

    declare cursor_name    --游标名称
    
    cursor [local | global]    --全局、局部
    
    [forward only | scroll]    --游标滚动方式
    
    [read_only | scroll_locks | optimistic]    --读取方式
    
    for select_statements                    --查询语句
    
    [for update | of column_name ...]        --修改字段
    

    参数:

         forward only | scroll:前贰个参数,游标只可以向后移动;后一个参数,游标能够从心所欲活动

         read_only:只读游标

         scroll_locks:游标锁定,游标在读取时,数据库会将该记录锁定,以便游标完结对记录的操作

         optimistic:该参数不会锁定游标;此时,假诺记录被读入游标后,对游标实行更新或删除不会超越

         B、 张开游标

              open cursor_name;

              游标打开后,能够运用全局变量@@cursor_rows展现读取记录条数

         C、 检索游标

              fetch cursor_name;

              检索情势如下:

                 fetch first; 读取第一行

                 fetch next; 读取下一行

                 fetch prior; 读取上一行

                 fetch last; 读取末了一行

                 fetch absolute n; 读取某一行

                    假设n为正整数,则读取第n条记下

                    若是n为负数,则尾数提取第n条记下

                    假使n为,则不读取任何笔录

                 fetch pelative n

                    若是n为正整数,则读取上次读取记录之后第n条记下

                    纵然n为负数,则读取上次读取记录以前第n条记下

                    要是n为,则读取上次读取的记录

         D、 关闭游标

              close cursor_name;

         E、 删除游标

              deallocate cursor_name;

         3、游标操作示例

    --创建一个游标
    
    declare cursor_stu cursor scroll for
    
        select id, name, age from student;
    
    --打开游标
    
    open cursor_stu;
    
    --存储读取的值
    
    declare @id int,
    
            @name nvarchar(20),
    
            @age varchar(20);
    
    --读取第一条记录
    
    fetch first from cursor_stu into @id, @name, @age;
    
    --循环读取游标记录
    
    print '读取的数据如下:';
    
    --全局变量
    
    while (@@fetch_status = 0)
    
    begin
    
        print '编号:'   convert(char(5), @id)   ', 名称:'   @name   ', 类型:'   @age;
    
        --继续读取下一条记录
    
        fetch next from cursor_stu into @id, @name, @age;
    
    end
    
    --关闭游标
    
    close area_cursor;
    
     
    
    --删除游标
    
    --deallocate area_cursor;
    

    本文由新葡亰496net发布于网络数据库,转载请注明出处:新葡亰496net5事务管理,案例代码

    关键词: