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

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

原文地址:https://www.cnblogs.com/xiaoXuZhi/p/xyh_trans_conclude.html

时间: 2024-10-28 23:22:58

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

sqlmap常用技巧整理

言 通过在乌云网上出现的很多SQL注入漏洞,因此来总结一下,大致使用SQLMAP所遇到的参数. 基本结构 基本SQLMAP的使用方式就如下所示,使用参数式的方式,按需求添加. 12 sqlmap.py -u "http:// *" --data="a=b" -p a --level 3 --random-agent --referer="a" --technique T --dbms=mysql --cookie="cookie&quo

SQL事务日志备份时的问题

1.在进行事务日志备份的时候,如下图: 3041 消息的疑难解答时的考虑事项:不会只是一个数据库或所有数据库出现问题吗?是备份到本地存储区或远程存储吗?哪种类型的备份 (数据库备份. 日志备份和差异备份) 是否出现故障?正在执行备份的应用程序 (SQL Server 代理作业. SQL 维护计划或 VDI/VSS 备份软件供应商提供的备份代理程序) 是什么?用于备份命令的选项是什么?什么是在其下运行 SQL Server 的帐户,此帐户没有所需的访问目标位置写入文件? 参考:http://sup

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

事务是将一系列操作作为一个单元执行,要么成功,要么失败,回滚到最初状态.在事务处理术语中,事务要么提交,要么中止.若要提交事务,所有参与者都必须保证对数据的任何更改是永久的.不论系统崩溃或是发生其他无法预料的事件,更改都必须是持久的.只要有一个参与者无法做出此保证,整个事务就会失败.事务范围内的所有数据更改将回滚到特定设置点. Begin TRANSACTION 语句1; If @@error<>0 Goto error 语句2; If @@error<>0 Goto error

sql事务和存储过程

一.sql事务 1.什么是事务:事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时事务是做为最小的控制单元来使用的.他包含的所有数据库操作命令作为一个整体一起向系提交或撤消,这一组数据库操作命令要么都执行,要么都不执行. 2.事务的语句开始事物:BEGIN TRANSACTION提交事物:COMMIT TRANSACTION回滚事务:ROLLBACK TRANSACTION 3.事务的4个特性  ①原子性(Atomicity):事务中的所有元素作为一个整体提交或回滚,是不可折分的,事

sql事务(Transaction)用法介绍及回滚实例_转

sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性 当对多个表进行更新的时候,某条执行失败.为了保持数据的完整性,需要使用事务回滚. 显示设置事务 代码如下 begin try   www.2cto.com begin transaction insert into shi

(一)SQL关联查询的使用技巧 (各种 join)

---恢复内容开始--- (一)SQL关联查询的使用技巧 (各种 join) 这几天因为工作的时候,发现自己的sql语句基础不是很好,特意研究了一下,发现sql语句真的是博大精深,sql语句不仅是要查出来你想要的数据,更讲究查询的效率,因为在查询大量数据时往往会因为数据量大,造成效率很低,再加上前后台数据的交互,造成了访问延迟等等的一系列问题. 在我们的日常工作中往往用到很多的查询方式,例如 嵌套查询,关联查询,子查询等等,就我而言,我感觉关联查询是最容易学习,和效率最高的.下面就我总结的关联查

sql事务的调用

一.数据库的SQL USE [Text]GO/****** Object: StoredProcedure [dbo].[mon] Script Date: 2017-01-03 15:59:28 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER proc [dbo].[mon] @toID int, --接收转账的账户 @fromID int , --转出自己的账户 @momeys money, --转账的金额 @back in

SQL—— 事务

SQL 事务: 1.  定义: 事务是作为单个逻辑单元执行的一系列操作. 多个操作作为一个整体向系统提交,要么执行.要么都不执行,事务是一个不可分割的工作逻辑单元.这特别适用于多用户同时操作的数据通信系统.例如:订票.银行.保险公司以及证券交易系统等. 2. 事务必须具备的特性: 1) 原子性:  Atomicity  :事务是一个完整的操作, 个元素是不可再分的.事务中所以元素必须作为一个整体提交或回滚.如果十五中任何元素失败,则整个事务将失败. 2)一致性: Consistency: 当事务

sql 事务日志传输

原文:sql 事务日志传输 概述 可以使用日志传送将事务日志不间断地从一个数据库(主数据库)发送到另一个数据库(辅助数据库).不间断地备份主数据库中的事务日志,然后将它们复制并还原到辅助数据库,这将使辅助数据库与主数据库基本保持同步.目标服务器充当备份服务器,并可以将查询处理从主服务器重新分配到一个或多个只读的辅助服务器.日志传送可与使用完整或大容量日志恢复模式的数据库一起使用:使用日志传送,您可以自动将“主服务器”实例上“主数据库”内的事务日志备份发送到单独“辅助服务器”实例上的一个或多个“辅