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 OpenID=@OutOpenID)>=@TAmount)
BEGIN
BEGIN TRANSACTION
BEGIN TRY
UPDATE tbUserWallet SET Amount=Amount-@TAmount WHERE OpenID=@OutOpenID
UPDATE tbUserWallet SET Amount=Amount+@TAmount WHERE OpenID=@InOpenID
--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,-@TAmount,@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

SQL SERVER TRANSACTION 事物的更多相关文章
- SQL Server Transaction Log Truncate && Shrink
目录 什么是事务日志 事务日志的组成 事务日志大小维护方法 Truncate Shrink 索引碎片 总结 什么是事务日志 Transaction log 是对数据库管理系统执行的一系列动作的记录 ...
- [转]sql server transaction
本文转自: http://www.2cto.com/database/201208/146734.html sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是 ...
- SQL Server 视图
视图实际上就是一个存储查询,重点是是可以混合和匹配来自基本表(或者其他视图)的数据,从而创建在很多方面像另一个基表那样起作用的对象.可以创建一个简单的查询,仅仅从一个表中选择几列,而忽略其他列:或者也 ...
- SQL Server中的事物
1.事务的四个属性 原子性Atomicity,一致性Consistency,隔离性Isolation,持久性Durability ,即ACID特性. 原子性:事务必须是一个完整工作的单元,要么全部执行 ...
- SQL Server 数据库的维护(三)__事务(transaction)和锁
--维护数据库-- --事务(transaction)和锁-- --事务(transaction)-- --概述: 事务是指封装了一组T-SQL语句的单个逻辑单元.单元中的所有语句作为一个整体,在满足 ...
- Sql Server 事物
事物的定义: 数据库的事物是原子性的,原子性的概念是指把一些事情当做一个单元来看待. 从数据库的角度看,它是指全部执行或者全部不执行的一条或者多条语句的最小组合:为了理解事务的概念,需要能够定义非常明 ...
- SQL Server——存储过程(Stored Procedure)、事物、触发器
存储过程(proc 或 procedure) 存储过程(Stored Procedure),计算机用语,是一组为了完成特定功能的SQL语句集,是利用SQL Server所提供的Transact-SQL ...
- sql server事物控制
一.多个数据库 1.存储过程 2.Commit写在 Try...Catch后面 protected void Button1_Click(object sender, EventArgs e) ...
- sql server 2008 r2 数据库操作时提示 9002错误“事物日志已满”问题
事务日志截断 若要避免数据库的事务日志被填满,例行备份至关重要.在简单恢复模式下,备份了数据库后会自动截断日志,而在完整恢复模式下,只有备份了事务日志后方才截断日志.但是,截断过程有时也可能发生延迟. ...
随机推荐
- 加密算法(DES,AES,RSA,MD5,SHA1,Base64)比较和项目应用(转载)
加密技术通常分为两大类:"对称式"和"非对称式". 对称性加密算法:对称式加密就是加密和解密使用同一个密钥.信息接收双方都需事先知道密匙和加解密算法且其密匙是相 ...
- 简谈Entity Framework的优缺点
Entity Framework简介 Entity Framework的全称为 ADO.NET Entity Framework ,简称为EF, 是微软以ADO.NET为基础发展出来的实体框架,早期被 ...
- .NetCore WebApi + Vue +MySql搭建博客
因为我是一直写C#的,所以最近闲暇时间一直在学习.NET Core,该博客的后端使用的就是.NET Core WebApi然后加前端Vue. 首先后端.NET Core搭的框架是一个仓储层+服务层+A ...
- Tree with Small Distances(cf1029E)(树形动规)
You are given an undirected tree consisting of \(n\) vertices. An undirected tree is a connected und ...
- BZOJ 3940--[Usaco2015 Feb]Censoring(AC自动机)
3940: [Usaco2015 Feb]Censoring Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 723 Solved: 360[Subm ...
- [NOIP2018]赛道修建(二分+multiset)
考场上打了一个 \(vector\) 解法,因为我当时不会 \(multiset\) 好吧,我来讲一讲今年的 \(tgD1T3\) 首先,这题 \(55\) 分是不难想的 1. \(b_i=a_i+1 ...
- es 修改拼音分词器源码实现汉字/拼音/简拼混合搜索时同音字不匹配
[版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 在业务中经常会用到拼音匹配查询,大家都会用到拼音分词器,但是拼音分词器匹配的 ...
- Task异步编程,刨根到底
1. 编译器到底对await做了什么 await 一个异步操作的时候,实际上编译器会创建一个状态机,这个状态机包含了调用者的上下文变量,状态机使用yield迭代器实现,状态机由clr调度,每次运行都会 ...
- (转)centos 7 Tomcat 8.5 的安装及生产环境的搭建调优
原文:https://www.cnblogs.com/linhankbl/articles/9149804.html#top JVM菜鸟进阶高手之路七(tomcat调优以及tomcat7.8性能对比) ...
- (转)【学习笔记】通过netstat+rmsock查找AIX端口对应进程
原文:http://www.oracleplus.net/arch/888.html https://www.ibm.com/support/knowledgecenter/zh/ssw_aix_72 ...