ibcadmin 发表于 2019-11-8 09:52:03

sql事务的使用及其技巧整理

<p style="text-align: center;"><strong>sql事件的使用及其本事整理</strong></p>
<p><strong>概述:</strong></p>
<p>  在实际项目开辟中,为了确保数据利用效果的划一性等要求,事件是一个必不可少的办理利器。</p>
<p>  根据SQLSERVER实现原理,实在,SQLSERVER的每一条实验语句都是一个事件利用,也就是说每一个SQL语句要么利用都乐成,要么利用都失败:好比,更新语句,同时更新多个字段,不会出现有的字段更新乐成,有的字段更新失败。</p>
<p>  但是,我们寻常在开辟过程过程中,说的事件:实在是指的一组有序的SQL聚集,通过事件确保这一组SQL聚集实验效果的划一性。</p>
<p> </p>
<p><strong>事件特性:</strong></p>
<p><strong>  </strong>事件的重要特性包括:<strong>原子性、划一性、隔离性、恒久性</strong></p>
<ol>
<li> <strong>原子性</strong>:事件必须是一个主动工作的单元,要么全部实验,要么全部不实验。</li>
<li><strong> 划一性</strong>:事件把数据库从一个划一状态带入到另一个划一状态,事件竣事的时间,全部的内部数据都是精确的。</li>
<li><strong>隔离性</strong>:并发多个事件时,一个事件的实验不受其他事件的影响。</li>
<li> <strong>恒久性</strong>:事件提交之后,数据是永世性的,不可再回滚,不受关机等事故的影响</li>
</ol>
<p><strong>事件分类:</strong></p>
<p><strong>  </strong>根据事件的实验维度力度,事件又分为:主动提交事件、显式事件、隐式事件<br /></p>
<p>   <strong>主动提交事件</strong>:sqlserver的一种默认机制,也叫自身事件,每一个sql语句实验都是接纳的这种模式<br />   <strong>显式事件</strong>:这也是我们寻经常说的事件, 通过 Begin Transaction开启事件开始,实验一组SQL语句,由Commit Transaction 提交事件、Rollback Transaction 回滚事件竣事。<br />   <strong>隐式事件</strong>:使用Set IMPLICIT_TRANSACTIONS ON 将隐式事件模式打开,sql实验完毕主动提交,当一个事件竣事,这个模式会主动启用下一个事件,只用Commit Transaction 提交事件、Rollback Transaction 回滚事件即可</p>
<p>   表现事件和隐式的重要区别安闲于,隐式事件在实验完毕后主动提交。</p>
<p><strong><strong>显式事件</strong>使用简介:</strong></p>
<p><strong>  </strong>表现事件通过begin Transaction 开启事件,通过Rollback Transaction 回滚事件</p>
<p>  数据准备,起首创建一个表:  </p>

---- 创建一个表TEST_Name ,每一个字段都好坏空
CREATE TABLE .(
        NULL,
        (50) NULL
) ON


<p> </p>
<p>  实例:</p>
<strong>---- 正常完整的实验一个事件,且事件内SQL无非常</strong>

---- 正常完整的实验一个事件,且事件内SQL无非常
begin tran
insert into TEST_name values(1,1)
insert into TEST_name values(3,3)
commit tran

<strong>---- 实验一个事件,且事件内SQL有非常<br /></strong>

<br />begin tran
insert into TEST_name values(10,10)
insert into TEST_name values(11,null)----次语句实验失败,缘故因由是该name不答应为空
insert into TEST_name values(12,12)
commit tran<br /><br />----- 语句终极实验效果是<br />乐成插入id为:10、12的两条数据

<p>  通过上面的语句,如许的实验效果和我们事件中的划一性相违背,这不是我们使用事件想要看到的效果,实在我们盼望的是这3个语句要么都插入乐成,要么都插入失败</p>
<strong> </strong>为了到达数据,可以通过以下三种方式来实现:<strong>try catch;实验效果判断,一步一步实验,错误回滚;开启 xact_abort(精准制止)</strong>
<p>  <strong>try catch 实现事件回滚</strong></p>

begin tran
begin try
    insert into TEST_name values(1,1)
    insert into TEST_name values(2,null)
    insert into TEST_name values(3,2)
    commit tran
end try
begin catch
    select '实验非常,事件回滚'
    rollback tran
end catch<br />---- 实验效果是:不会插入一条数据

<p>  </p>
<p><strong>   </strong><strong style="font-family: 'Courier New'; font-size: 12px;">实验效果判断,一步一步实验,错误回滚</strong></p>

begin tran
    declare @error int
    set @error=0
   
    insert into TEST_name values(1,1)
    set @error=@error+@@error
    insert into TEST_name values(2,null)
    set @error=@error+@@error
    insert into TEST_name values(3,2)
    set @error=@error+@@error
   
if(@error<>0)
    begin
      select '实验非常,事件回滚'
      rollback tran
    end
else
    begin
      commit tran
    end

<p> </p>

---- 每一步实验效果都精确才继承往下实验
begin tran
    ---- 影响行数
    declare @ROWCOUNT int
    set @ROWCOUNT=0
   
    insert into TEST_name values(1,1)
    set @ROWCOUNT=@@ROWCOUNT
    if(@ROWCOUNT>0)
      begin
            insert into TEST_name values(2,null)
            set @ROWCOUNT=@@ROWCOUNT
      end
      
    if(@ROWCOUNT>0)
      begin
            insert into TEST_name values(3,2)
            set @ROWCOUNT=@@ROWCOUNT
      end
      
if(@ROWCOUNT<=0)
    begin
      select '实验非常,事件回滚'
      rollback tran
    end
else
    begin
      commit tran
    end

<p> </p>
<strong>开启 xact_abort(精准制止)<br /></strong>

---- XACT_ABORT 设置 on :代表某一个语句实验错误,都不在继承往下实验,并主动回滚事件<br />---- XACT_ABORT 设置 off :代表某一个语句实验错误,子回滚该条语句实验,并继承实验后续语句,同时提交实验乐成的语句<br />  ---- off 此种情况应该很少在事件中使用,究竟使用事件的目标就是实实际验效果的划一性<br />set XACT_ABORT on
begin tran
insert into TEST_name values(10,10)
insert into TEST_name values(11,null)----次语句实验失败,缘故因由是该name不答应为空
insert into TEST_name values(12,12)
commit tran

<p> </p>
<p><strong>设置事件生存点:</strong></p>
<p><strong> </strong> 在寻常的事件使用过程中,另有大概必要实现,事件回滚时,只回滚到指定位置,指定位置之前的实验效果不在回滚</p>
<p>  在sqlserver中可以通过事件生存点,来实现对事件的精确回滚,关键词是:save transaction   和rollback transaction ,具体使用规则如下:</p>
<p> </p>

---- 每一步实验效果都精确才继承往下实验
begin tran
    ---- 影响行数
    declare @ROWCOUNT int
    set @ROWCOUNT=0
   
    insert into TEST_name values(1,1)
    set @ROWCOUNT=@@ROWCOUNT
    save tran stanstation1
    --- save tran transtation1
    if(@ROWCOUNT>0)
      begin
            insert into TEST_name values(2,null)
            set @ROWCOUNT=@@ROWCOUNT
      end
      
    if(@ROWCOUNT>0)
      begin
            insert into TEST_name values(3,2)
            set @ROWCOUNT=@@ROWCOUNT
      end
      
if(@ROWCOUNT<=0)
    begin
      select '实验非常,事件回滚'
      ---- 实验效果是:1,1 乐成插入到数据库表中
      rollback tran stanstation1
    end
else
    begin
      select '事件提交'
      commit tran
    end

<p> </p>
<p> <strong>总结:</strong></p>
<p><strong>  </strong>通过上面的温习,联合练习,对sql的事件有了进一步的相识。简单的总结:实际上实验的每一个sql都是接纳事件来实现的,在实际使用中,我们一样平常接纳表现事件来处理处罚业务,但是在事件的使用过程中肯定要联合对应的战略来确保事件实验效果的划一性。</p>
<p>  本日就写到这,来日诰日再简单那梳理总结一下分布式事件的实现方式,这个也是很告急的模块,尤其是在如今的大型体系中,分库分表时,分布式事件很管用</p>
<strong><br /><br /><br /><br /><br /><br /></strong>
<h1 style="border: none; font-variant-numeric: normal; font-variant-east-asian: normal; font-weight: normal; font-stretch: normal; font-size: 36px; line-height: 46.8px; font-family: 'Microsoft YaHei UI', 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; margin: -10px 0px 35px; outline: 0px; padding: 0px; clear: both; color: #707070; list-style-type: none; height: auto;">xact_abort</h1>
页: [1]
查看完整版本: sql事务的使用及其技巧整理