SQL 事务

首先声明,以下是个人见解,如有错误望指出,先谢谢!

我们知道数据库(SQL) 的事务,现在我讲讲我的大概了解:

数据库的事务使用基本语法:

begin try
	begin tran [tranName]
	 --语句
	commit tran [tranName]
end try
begin catch
   rollback tran [tranName]
end catch

[] 表示可有可无,

try catch 我就不说了。 数据库执行事务成功与否 看的是计数,即 begin tran  和 commit tran 的计数。当计数一样就成功,不成功报如下错误:

EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 1,当前计数 = 2 , 只要是两个计数不一样,就会出现错误

一般写事务就是一层,所以 有没有事务名一样,当事务有多层(存储过程调用存储过程,循环调用存储过程(存储过程都是带事务的)) 这时候事务名是很重要的

简单说一下,当有A(含事务) 存储过程调用B(含事务)存储过程,如果 B 事务不指定事务名,当B 回滚的时候会将 A 的存储过程 计数也回滚,导致两个计数不一致,

如果 B 事务指定事务名,将不会影响 A 事务的计数。这就是有事务名和没有事务名的区别,一句话:有事务名就是当前事务,没有事务名就是整个事务。

C# 中有个 SqlTransaction 类,怎么使用我就不说了,这个类的事务和数据库的事务是一样的,他们公用同一个进程,也就是说 在C# 类里有事务,在执行的SQL里

也有事务,当把SQL里的事务提交(没有指明事务名的情况) 会导致 C# 当前的 事务对象为null.

这里顺便说下: set xact_abort on   这个设置是指 出错后自动回滚,一般用在存储过程中。

下面给一个事务嵌套的例子:

表结构:

CREATE TABLE [dbo].[Test](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Name] [nvarchar](5) NOT NULL
) ON [PRIMARY]

子事务:

CREATE procedure [dbo].[CreateSubTran]
(
  @Name nvarchar(50),
  @Status int output
)
as
begin
    begin try
       print ‘准备开始:‘+CAST(@@TRANCOUNT AS VARCHAR(50))
      begin tran currentTran
       save tran preTran
         print ‘事务开始:‘+CAST(@@TRANCOUNT AS VARCHAR(50))
      insert test(Name)
      values(@Name)
      set @Status=1
       print ‘执行成功:‘+CAST(@@TRANCOUNT AS VARCHAR(50))
      commit tran currentTran
      print ‘commit‘
    end try
    begin catch
     print ‘出错回滚前:‘+CAST(@@TRANCOUNT AS VARCHAR(50))
        if(@@TRANCOUNT>0)
        begin
			rollback tran preTran
        end
        set @Status=-1
        commit tran currentTran
        print ‘出错回滚后:‘+CAST(@@TRANCOUNT AS VARCHAR(50))
        return 0
    end catch   

end

 父事务:

create proc CreateParentTran
as
begin
declare @result int
    begin try
    begin tran
     exec  [CreateSubTran] ‘sdfsd‘,@result output
     commit tran
    end try
    begin catch
       rollback tran
    end catch
end

 注意: 最外层事务可以不用指定事务名,嵌套事务必须指定事务名,上面已经讲的很清楚。

如图结果:事务开始的计数必须与结束的计数是一样的

当事务执行回滚后,当前的计数 就等于事务还未开始前的计数。

 

时间: 2024-10-12 20:34:18

SQL 事务的相关文章

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事务的调用

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

sql事务,在sql2000里判断执行是否成功用@@ERROR 判断

原文:sql事务,在sql2000里判断执行是否成功用@@ERROR 判断 贴个sql事务,在sql2000里判断执行是否成功用@@ERROR 判断 这个东西多少还是有点问题,sql2005了可以用try..catch了,不管那块错都能捕捉,然后在回滚,很方便,贴出来晾晾 BEGIN TRANSACTION; BEGIN TRY  --try 执行sql       SELECT 1/0; END TRY BEGIN CATCH  --cache抓错     SELECT         ERR

SQL 事务 (存储过程与事务)

<1> C# 执行SQL事务 又两种方法(本人总结的) 1.通过存储过程. 现在就演示一下通过存储过程来执行SQL事务. 2.通过C#中提供的 Transaction . SQL Server 事务语法 Sql server 事务的两种用法 <1>创建一个存储过程, use sales --指定数据库 create table bb --创建bb 这个表 ( ID int not null primary key ,--账号 Moneys money --转账金额 ) --bb表里

030.[转] sql事务特性

sql事务特性简介 pphh发布于2018年10月5日 Sql事务有原子性.一致性.隔离性.持久性四个基本特性,要实现完全的ACID事务,是以牺牲事务的吞吐性能作为代价的.在有些应用场景中,通过分析业务数据读写,使得可以降低事务的隔离性,容忍相应出现的数据一致性问题,实现事务的高并发.高吞吐.低时延性,这是sql事务优化的最佳实践.本文对sql标准中隔离性级别定义和可能会出现的问题进行一一介绍,最后通过Mysql数据库进行相应的演示. 目录 1. Sql事务特性 2. Sql事务特性:原子性 3