SQL SERVER TRANSACTION 事物

1.事务的概念

事物是一种机制,是一种操作序列,它包含了数据库一组操作命令,这组命令要么全部执行,要么都不执行。因此事物是一组不可分割的事物逻辑单元,在数据库进行并发操作时候,事物是作为最小的控制单元来使用的,这特别适用于多用户同时操作的数据通信系统。例如:订票、银行、保险公司以及证券交易系统等。

2.事物的4大属性

  • 原子性:事物是一个完整的操作;
  • 隔离性:对数据进行修改的所有并发事物都是彼此隔离的;
  • 一致性:当事物完成时,事物必须处于一致的状态;
  • 持久性:事物完成后,对于系统的影响是永久的;

3.创建事物

  • 开始事物:transaction begin
  • 提交事物:commit transaction
  • 回滚事物:rollback transaction

4.事物的分类

  • 显示事物:用begin transaction 明确指定事物的开始,用commit transaction, rollback transaction来结束或者回滚事务
  • 隐示事物(自动提交事物):隐式事务则在执完语句后自动提交事务

5.事例

实现转账操作,转账人出账和收账人入账是一组完整的操作序列,必须全部完成或不完成,准备一张用户钱包表(tbUserWallet),转账交易记录表(tbTransaction),简单设计如下

 

向用户钱包表(tbUserWallet)添加测试数据

创建转账存储事物

USE [TEST]
GO

/****** Object:  StoredProcedure [dbo].[pAddTransaction]    Script Date: 2018/5/21 12:44:59 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:		yangyi
-- Create date: 18/05/21
-- Description:	转账
-- =============================================
CREATE PROCEDURE [dbo].[pAddTransaction]
@InOpenID uniqueidentifier,
@InTDesc nvarchar(50),
@OutOpenID uniqueidentifier,
@OutTDesc nvarchar(50),
@TAmount decimal(10, 2),
@TTID int,
@Result int output
AS
BEGIN
	IF((SELECT Amount FROM tbUserWallet WHERE [email protected])>[email protected])
	BEGIN
		BEGIN TRANSACTION
			BEGIN TRY
				UPDATE tbUserWallet SET [email protected] WHERE [email protected]
				UPDATE tbUserWallet SET [email protected] WHERE [email protected]
				--SELECT 1+‘A‘
				INSERT INTO [dbo].[tbTransaction]([TID],[OpenID],[TAmount],[TTID],[TDesc],[CreateDT])VALUES(NEWID(),@InOpenID,@TAmount,@TTID,@InTDesc,GETDATE())
				INSERT INTO [dbo].[tbTransaction]([TID],[OpenID],[TAmount],[TTID],[TDesc],[CreateDT])VALUES(NEWID(),@OutOpenID,[email protected],@TTID,@OutTDesc,GETDATE())
			END TRY
			BEGIN  CATCH
				IF(@@TRANCOUNT>0)
				BEGIN
					SET @Result=-1
					PRINT ‘事物执行出错,回滚‘
					ROLLBACK TRANSACTION
				END
			END CATCH
		IF(@@TRANCOUNT>0)
		BEGIN
			SET @Result=1
			PRINT ‘一切按预期计划执行‘
			COMMIT TRANSACTION
		END
	END
	ELSE
	BEGIN
		PRINT ‘转账人金额不足‘
		SET @Result=0
	END
END

GO

测试1>:转账人金额不足测试

USE [TEST]
GO

DECLARE	@return_value int,
		@Result int

EXEC	@return_value = [dbo].[pAddTransaction]
		@InOpenID = ‘1ccd524d-de62-47ca-87d3-38787b040ba3‘,
		@InTDesc = N‘收到A的转账100‘,
		@OutOpenID = ‘2ccd524d-de62-47ca-87d3-38787b040ba3‘,
		@OutTDesc = N‘转账给A100‘,
		@TAmount = 100,
		@TTID = 1,
		@Result = @Result OUTPUT

SELECT	@Result as N‘@Result‘

GO

测试2>:模拟事物出现错误,进行回滚

取消存储事物中的:SELECT 1+‘A‘ 注释(模拟事物中发生错误)

USE [TEST]
GO

DECLARE	@return_value int,
		@Result int

EXEC	@return_value = [dbo].[pAddTransaction]
		@InOpenID = ‘2ccd524d-de62-47ca-87d3-38787b040ba3‘,
		@InTDesc = N‘收到A的转账100‘,
		@OutOpenID = ‘1ccd524d-de62-47ca-87d3-38787b040ba3‘,
		@OutTDesc = N‘转账给A100‘,
		@TAmount = 100,
		@TTID = 1,
		@Result = @Result OUTPUT

SELECT	@Result as N‘@Result‘

GO

  

测试3.>执行成功测试,注释 SELECT 1+‘A‘

USE [TEST]
GO

DECLARE	@return_value int,
		@Result int

EXEC	@return_value = [dbo].[pAddTransaction]
		@InOpenID = ‘2ccd524d-de62-47ca-87d3-38787b040ba3‘,
		@InTDesc = N‘收到A的转账100‘,
		@OutOpenID = ‘1ccd524d-de62-47ca-87d3-38787b040ba3‘,
		@OutTDesc = N‘转账给A100‘,
		@TAmount = 100,
		@TTID = 1,
		@Result = @Result OUTPUT

SELECT	@Result as N‘@Result‘

GO

原文地址:https://www.cnblogs.com/heyangyi/p/9055428.html

时间: 2024-09-30 19:09:29

SQL SERVER TRANSACTION 事物的相关文章

SQL Server Transaction Log Truncate && Shrink

目录 什么是事务日志 事务日志的组成 事务日志大小维护方法 Truncate Shrink 索引碎片 总结 什么是事务日志 Transaction log   是对数据库管理系统执行的一系列动作的记录,并利用这些记录来保证在遭遇硬件故障,灾难情况下ACID的可用性.从物理上来说,事务日志就是一个记录对数据库更新操作的文件. 事务日志的组成 SQL Server 数据库引擎在内部将每个物理文件分为多个虚拟日志文件.虚拟日志文件没有固定大小和固定数量,这两个值是由数据库引擎动态决定的. 事务日志是一

Sql Server Transaction Isolation Level

并发事务引起的问题       问题                               描述                                     结果                                        解决                      丢失更新 A读—B读—A改—B改 A更改丢失 READ UNCOMMITTED 脏读 A改—B读—A回滚 B读无效值 READ COMMITTED 不可重读 A读—B改—A读 A读不一致 RE

SQL Server 视图

视图实际上就是一个存储查询,重点是是可以混合和匹配来自基本表(或者其他视图)的数据,从而创建在很多方面像另一个基表那样起作用的对象.可以创建一个简单的查询,仅仅从一个表中选择几列,而忽略其他列:或者也可以创建一个复杂的查询,连接几个表,使的这些表看起来像一个表. 一.简单的视图 视图的语法如下: CREATE VIEW <view name> AS <SELECT statement> 具体语法: CREATE VIEW [schema_name].<view name>

SQL Server事物的存储过程

在酒店管理系统开发中,我们会创建房间表和房间类型表(房型表)这两个表,如下图所示: 房型表:RoomType 房间表:Room 首先这两个表的关系:Room是从表,RoomType是主表,两表有主外键关系,RoomType.rTypeId=Room.rTypeId 分析这两个表,我们会发现这样一个问题:在房间表和房型表管理中,当我们修改或者删除一个RoomType表,对应的Room表我们也要做修改和删除,那么我们怎么解决这个问题呢?首先可以在数据库中设置级联删除,或者利用触发器也可以解决...这

SQL Server中的事物

1.事务的四个属性 原子性Atomicity,一致性Consistency,隔离性Isolation,持久性Durability ,即ACID特性. 原子性:事务必须是一个完整工作的单元,要么全部执行,要么全部不执行. 一致性:事务结束的时候,所有的内部数据都是正确的. 隔离性:并发多个事务时,各个事务不干涉内部数据,处理的都是另外一个事务处理之前或之后的数据. 持久性:事务提交之后,数据是永久性的,不可再回滚. 2.在SQL Server中事务被分为3类常见的事务 自动提交事务:是SQL Se

Sql Server 事物

事物的定义: 数据库的事物是原子性的,原子性的概念是指把一些事情当做一个单元来看待. 从数据库的角度看,它是指全部执行或者全部不执行的一条或者多条语句的最小组合:为了理解事务的概念,需要能够定义非常明确的边界.事务要有非常明确的开始和结束点.SQL Server中的每一条SELECT.INSERT.UPDATE和DELETE语句都是隐式事务的一部分.即使只发出一条语句,也会把这条语句当做一个事务-要么执行语句中的所有内容,要么什么都不执行.但是如果需要的不只是一条,可能是多条语句呢?在这种情况下

sql server 2008 r2 数据库操作时提示 9002错误“事物日志已满”问题

事务日志截断 若要避免数据库的事务日志被填满,例行备份至关重要.在简单恢复模式下,备份了数据库后会自动截断日志,而在完整恢复模式下,只有备份了事务日志后方才截断日志.但是,截断过程有时也可能发生延迟.有关识别和应对各种延迟因素的信息,请参阅可能延迟日志截断的因素. 注意  BACKUP LOG WITH NO_LOG 和 WITH TRUNCATE_ONLY 选项已废止.使用完整恢复模式或大容量日志恢复模式时,如果必须删除数据库中的日志备份链,请切换至简单恢复模式.有关详细信息,请参阅有关从完整

sql server中的开窗函数over、视图、事物

一.开窗函数over的作用有两个: 1.排序order by,row_number,翻页 2.划区partition by,结合聚合函数针对某部分数据进行汇总 翻页的sql server 语句: select * from ( select *,row_number() over( order by id) as num from 表名) as t where t.num>6 and t.num<10 二.视图:用于存储一个select语句.并不是存储数据的一个容器. create view

SQL Server中事务transaction如果没写在try catch中,就算中间语句报错还是会提交

假如我们数据库中有两张表Person和Book Person表: CREATE TABLE [dbo].[Person]( [ID] [int] IDENTITY(1,1) NOT NULL, [Code] [nvarchar](50) NULL, [Name] [nvarchar](50) NULL, [CreateTime] [datetime] NULL, [UpdateTime] [datetime] NULL, CONSTRAINT [PK_Person] PRIMARY KEY CL