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

概述:

  在实际项目开发中,为了确保数据操作结果的一致性等要求,事务是一个必不可少的解决利器。

  根据SQLSERVER实现原理,其实,SQLSERVER的每一条执行语句都是一个事务操作,也就是说每一个SQL语句要么操作都成功,要么操作都失败:比如,更新语句,同时更新多个字段,不会出现有的字段更新成功,有的字段更新失败。

  但是,我们平时在开发过程过程中,说的事务:其实是指的一组有序的SQL集合,通过事务确保这一组SQL集合执行结果的一致性。

事务特性:

  事务的主要特性包括:原子性、一致性、隔离性、持久性

  1. 原子性:事务必须是一个自动工作的单元,要么全部执行,要么全部不执行。
  2.  一致性:事务把数据库从一个一致状态带入到另一个一致状态,事务结束的时候,所有的内部数据都是正确的。
  3. 隔离性:并发多个事务时,一个事务的执行不受其他事务的影响。
  4. 持久性:事务提交之后,数据是永久性的,不可再回滚,不受关机等事件的影响

事务分类:

  根据事务的执行维度力度,事务又分为:自动提交事务、显式事务、隐式事务

   自动提交事务:sqlserver的一种默认机制,也叫自身事务,每一个sql语句执行都是采用的这种模式
   显式事务:这也是我们平时常说的事务, 通过 Begin Transaction开启事务开始,执行一组SQL语句,由Commit Transaction 提交事务、Rollback Transaction 回滚事务结束。
   隐式事务:使用Set IMPLICIT_TRANSACTIONS ON 将隐式事务模式打开,sql执行完毕自动提交,当一个事务结束,这个模式会自动启用下一个事务,只用Commit Transaction 提交事务、Rollback Transaction 回滚事务即可

   显示事务和隐式的主要区别自在于,隐式事务在执行完毕后自动提交。

显式事务使用简介:

  显示事务通过begin Transaction 开启事务,通过Rollback Transaction 回滚事务

  数据准备,首先创建一个表:  

---- 创建一个表TEST_Name ,每一个字段都是非空
CREATE TABLE [dbo].[TEST_Name](
[Id] [int] NULL,
[Name] [nvarchar](50) NULL
) ON [PRIMARY]

 

  实例:

---- 正常完整的执行一个事务,且事务内SQL无异常
---- 正常完整的执行一个事务,且事务内SQL无异常
begin tran
insert into TEST_name values(1,1)
insert into TEST_name values(3,3)
commit tran
---- 执行一个事务,且事务内SQL有异常
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 ----- 语句最终执行结果是
成功插入id为:10、12的两条数据

  通过上面的语句,这样的执行结果和我们事务中的一致性相违背,这不是我们使用事务想要看到的效果,其实我们希望的是这3个语句要么都插入成功,要么都插入失败

 为了达到数据,可以通过以下三种方式来实现:try catch;执行结果判断,一步一步执行,错误回滚;开启 xact_abort(精准终止)

  try catch 实现事务回滚

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
---- 执行结果是:不会插入一条数据

  

   执行结果判断,一步一步执行,错误回滚

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
---- 每一步执行结果都正确才继续往下执行
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
开启 xact_abort(精准终止)
---- XACT_ABORT 设置 on :代表某一个语句执行错误,都不在继续往下执行,并自动回滚事务
---- XACT_ABORT 设置 off :代表某一个语句执行错误,子回滚该条语句执行,并继续执行后续语句,同时提交执行成功的语句
  ---- off 此种情况应该很少在事务中使用,毕竟使用事务的目的就是实现执行结果的一致性
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

设置事务保存点:

  在平时的事务使用过程中,还有可能需要实现,事务回滚时,只回滚到指定位置,指定位置之前的执行结果不在回滚

  在sqlserver中可以通过事务保存点,来实现对事务的精确回滚,关键词是:save transaction   和rollback transaction ,具体使用规则如下:

---- 每一步执行结果都正确才继续往下执行
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

 总结:

  通过上面的温习,结合练习,对sql的事务有了进一步的了解。简单的总结:实际上执行的每一个sql都是采用事务来实现的,在实际使用中,我们一般采用显示事务来处理业务,但是在事务的使用过程中一定要结合对应的策略来确保事务执行结果的一致性。

  今天就写到这,明天再简单那梳理总结一下分布式事务的实现方式,这个也是很重要的模块,尤其是在现在的大型系统中,分库分表时,分布式事务很管用



xact_abort

sql事务的使用及其技巧整理的更多相关文章

  1. sqlmap常用技巧整理

    言 通过在乌云网上出现的很多SQL注入漏洞,因此来总结一下,大致使用SQLMAP所遇到的参数. 基本结构 基本SQLMAP的使用方式就如下所示,使用参数式的方式,按需求添加. 12 sqlmap.py ...

  2. Mysql - 游标/动态sql/事务

    游标这个在我目前的项目里面用的还不多, 但是其功能还是很强大的. 动态sql以前都没用过, 是跟着富士康(不是张全蛋的富土康哦)过来的同事学的. 还是挺好用的. 我的数据库方面, 跟他学了不少. 在此 ...

  3. 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  4. sql事务(Transaction)用法介绍及回滚实例

    sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务, S ...

  5. sql事务的调用

    一.数据库的SQL USE [Text]GO/****** Object: StoredProcedure [dbo].[mon] Script Date: 2017-01-03 15:59:28 * ...

  6. SQL事务

    一.事务概念    事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是一个不可分割的工作逻辑单元.在数据库系统上执行并发操作时事务是作为最小的 ...

  7. SQL—— 事务

    SQL 事务: 1.  定义: 事务是作为单个逻辑单元执行的一系列操作. 多个操作作为一个整体向系统提交,要么执行.要么都不执行,事务是一个不可分割的工作逻辑单元.这特别适用于多用户同时操作的数据通信 ...

  8. IT第十天 - String和StringBuffer的比较、编程设计技巧整理、本周总结 ★★★

    IT第十天 上午 String 1.String在进行多次的+扩展时,会严重的降低处理效率,因为String长度是不可变的,在进行+运算改变字符串时,会自动创建很多临时字符串,并不是在原字符串上追加, ...

  9. SQL 事务及实例演示

    简介 事务,英文名称是transaction.是在对数据库进行管理操作过程中一个逻辑单位,由有限的操作序列构成. 其实这个概念很好懂,简单理解就是:事务就是在使用数据库中的一个操作,由一些操作放到一起 ...

随机推荐

  1. HBase 官方文档0.90.4

    HBase 官方文档0.90.4 Copyright © 2010 Apache Software Foundation, 盛大游戏-数据仓库团队-颜开(译) Revision History Rev ...

  2. 002:CSS基础

    注意:蓝色 重要:红色 目录: 1. 学会使用CSS选择器: 9大选择器.交集选择器.并集选择器.后代选择器.子代选择器.伪类选择器. 2.font.color.横向竖向居中.文本修饰.首行缩进. f ...

  3. 简单粗暴的关键两部实现连接远程云服务器数据库SqlServer 2012

    要连上远程服务器的数据库,前面的那些数据库配置就不说了,网上都一样. 下面讲讲关键的两点,也是我尝试普通的方法无效后通过下面的方法成功连上的. 1.点开云服务器的安全组,看看里面的端口是否都放行了.我 ...

  4. [Advanced Python] 11 - Implement a Class

    基础概念:[Python] 08 - Classes --> Objects 进阶概念:[Advanced Python] 11 - Implement a Class 参考资源:廖雪峰,面向对 ...

  5. [Code] 烧脑之算法模型

    把博客的算法过一遍,我的天呐多得很,爱咋咋地! 未来可考虑下博弈算法. 基本的编程陷阱:[c++] 面试题之犄角旮旯 第壹章[有必要添加Python] 基本的算法思想:[Algorithm] 面试题之 ...

  6. RxSwift 中的调度器

    与 ReactiveCocoa 相比,Rx 的一大优势就是更丰富的并发模型.提到并发,就不得不提多线程.在 RxSwift 中,与线程对应的概念就是调度器,本文就调度器做些介绍,包括并发调度器.串行调 ...

  7. Docker 01 - CentOS 7 中安装 Docker 的详细步骤

    目录 1 初识 Docker 1.1 Docker 原理简介 1.2 Docker 核心概念 2 安装 Docker 2.1 查看系统内核版本 2.2 更新 yum 包 2.3 安装软件包 2.4 向 ...

  8. 基于Spark的电影推荐系统(实战简介)

    写在前面 一直不知道这个专栏该如何开始写,思来想去,还是暂时把自己对这个项目的一些想法 和大家分享 的形式来展现.有什么问题,欢迎大家一起留言讨论. 这个项目的源代码是在https://github. ...

  9. Maven 梳理-自动创建Maven项目(非web)

    mvn archetype:create和mvn archetype:generate create is deprecated in maven 3.0.5 and beyond,在maven3.0 ...

  10. eShopOnContainers学习系列(一):Swagger的使用

    最近在看eShopOnContainer项目,抽取一下其中的基础知识点,做个记录,有兴趣的可以看下. 新建一个.net core API项目,添加Nuget包 Swashbuckle.AspNetCo ...