ibcadmin 发表于 2019-10-24 09:49:02

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><br><br/><br/><br/><br/><br/>来源:<a href="https://www.cnblogs.com/xiaoXuZhi/p/xyh_trans_conclude.html" target="_blank">https://www.cnblogs.com/xiaoXuZhi/p/xyh_trans_conclude.html</a>
页: [1]
查看完整版本: sql事务的使用及其技巧整理