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错误“事物日志已满”问题
事务日志截断 若要避免数据库的事务日志被填满,例行备份至关重要.在简单恢复模式下,备份了数据库后会自动截断日志,而在完整恢复模式下,只有备份了事务日志后方才截断日志.但是,截断过程有时也可能发生延迟. ...
随机推荐
- easyUi DataGrid 显示日期列,时间为空也可,的正常显示,及普通居中列情况
$('#tt').datagrid({ url: '@Url.Content("~/kpi/FindList")', w ...
- [ASE][Daily Scrum]11.05
在昨天的课程之后经过讨论进行了初步的分工,并制定出了我们的一个两周计划. 尚没有和老师讨论,已经询问了时间没有收到回复,等老师那边讨论过后我会在更新这个部分. 第一阶段的目标是用户能够在一个空白的地图 ...
- caffe 教程
Caffe是一个清晰而高效的深度学习框架,本文详细介绍了caffe的优势.架构,网络定义.各层定义,Caffe的安装与配置,解读了Caffe实现的图像分类模型AlexNet,并演示了CIFAR-10在 ...
- .Net 持续集成 —— windows service
上一篇讲了 Jenkins+WebDeploy+IIS完成 web项目部署,这篇继续讲windows service的部署. windows service 一般用于自动任务,定时完成某些操作.本文自 ...
- 使用 xUnit 编写 ASP.NET Core WebAPI单元测试
本文使用xUnit对ASP.NET Core WebAPI做单元测试,使用HttpClient的同步和异步请求,下面详细介绍xUnit的使用过程: 一.创建示例项目 模板为我们自动创建了一个Value ...
- FastReport使用方法(C/S版)
前言 这两天群里一直有群友问一些关于FastReport的问题,结合他们的问题,在这里做一个整理,有不明白的可以加 FastReport 交流群 群 号:554714044 工具 VS2017 + ...
- SQL注入之PHP-MySQL实现手工注入-字符型
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎 ...
- 全屏使用swiper.js过程中遇到的坑
概述 swiper.js确实是一个很好用的插件,下面记录下我在全屏使用过程中遇到的一些坑和解决办法,供以后开发时参考,相信对其他人也有用. 通用方案 一般来说,swiper需要放在body的下一层,虽 ...
- 第十三章 ReentrantLock 简介
Java 5.0 提供的新的加锁机制:当内置加锁机制不适合时 , 作为一种可选择的高级功能 一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一 ...
- DevOps - CI - SVN
SVN http://tortoisesvn.net/ 支持文档:http://tortoisesvn.net/support.html 在线TortoiseSVN 中文文档:http://torto ...