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 事物的更多相关文章

  1. SQL Server Transaction Log Truncate && Shrink

    目录 什么是事务日志 事务日志的组成 事务日志大小维护方法 Truncate Shrink 索引碎片 总结 什么是事务日志 Transaction log   是对数据库管理系统执行的一系列动作的记录 ...

  2. [转]sql server transaction

    本文转自: http://www.2cto.com/database/201208/146734.html sql事务(Transaction)用法介绍及回滚实例   事务(Transaction)是 ...

  3. SQL Server 视图

    视图实际上就是一个存储查询,重点是是可以混合和匹配来自基本表(或者其他视图)的数据,从而创建在很多方面像另一个基表那样起作用的对象.可以创建一个简单的查询,仅仅从一个表中选择几列,而忽略其他列:或者也 ...

  4. SQL Server中的事物

    1.事务的四个属性 原子性Atomicity,一致性Consistency,隔离性Isolation,持久性Durability ,即ACID特性. 原子性:事务必须是一个完整工作的单元,要么全部执行 ...

  5. SQL Server 数据库的维护(三)__事务(transaction)和锁

    --维护数据库-- --事务(transaction)和锁-- --事务(transaction)-- --概述: 事务是指封装了一组T-SQL语句的单个逻辑单元.单元中的所有语句作为一个整体,在满足 ...

  6. Sql Server 事物

    事物的定义: 数据库的事物是原子性的,原子性的概念是指把一些事情当做一个单元来看待. 从数据库的角度看,它是指全部执行或者全部不执行的一条或者多条语句的最小组合:为了理解事务的概念,需要能够定义非常明 ...

  7. SQL Server——存储过程(Stored Procedure)、事物、触发器

    存储过程(proc 或 procedure) 存储过程(Stored Procedure),计算机用语,是一组为了完成特定功能的SQL语句集,是利用SQL Server所提供的Transact-SQL ...

  8. sql server事物控制

    一.多个数据库 1.存储过程 2.Commit写在 Try...Catch后面 protected void Button1_Click(object sender, EventArgs e)    ...

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

    事务日志截断 若要避免数据库的事务日志被填满,例行备份至关重要.在简单恢复模式下,备份了数据库后会自动截断日志,而在完整恢复模式下,只有备份了事务日志后方才截断日志.但是,截断过程有时也可能发生延迟. ...

随机推荐

  1. easyUi DataGrid 显示日期列,时间为空也可,的正常显示,及普通居中列情况

    $('#tt').datagrid({                url: '@Url.Content("~/kpi/FindList")',                w ...

  2. [ASE][Daily Scrum]11.05

    在昨天的课程之后经过讨论进行了初步的分工,并制定出了我们的一个两周计划. 尚没有和老师讨论,已经询问了时间没有收到回复,等老师那边讨论过后我会在更新这个部分. 第一阶段的目标是用户能够在一个空白的地图 ...

  3. caffe 教程

    Caffe是一个清晰而高效的深度学习框架,本文详细介绍了caffe的优势.架构,网络定义.各层定义,Caffe的安装与配置,解读了Caffe实现的图像分类模型AlexNet,并演示了CIFAR-10在 ...

  4. .Net 持续集成 —— windows service

    上一篇讲了 Jenkins+WebDeploy+IIS完成 web项目部署,这篇继续讲windows service的部署. windows service 一般用于自动任务,定时完成某些操作.本文自 ...

  5. 使用 xUnit 编写 ASP.NET Core WebAPI单元测试

    本文使用xUnit对ASP.NET Core WebAPI做单元测试,使用HttpClient的同步和异步请求,下面详细介绍xUnit的使用过程: 一.创建示例项目 模板为我们自动创建了一个Value ...

  6. FastReport使用方法(C/S版)

    前言 这两天群里一直有群友问一些关于FastReport的问题,结合他们的问题,在这里做一个整理,有不明白的可以加 FastReport 交流群 群   号:554714044 工具 VS2017 + ...

  7. SQL注入之PHP-MySQL实现手工注入-字符型

    SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎 ...

  8. 全屏使用swiper.js过程中遇到的坑

    概述 swiper.js确实是一个很好用的插件,下面记录下我在全屏使用过程中遇到的一些坑和解决办法,供以后开发时参考,相信对其他人也有用. 通用方案 一般来说,swiper需要放在body的下一层,虽 ...

  9. 第十三章 ReentrantLock 简介

    Java 5.0 提供的新的加锁机制:当内置加锁机制不适合时 , 作为一种可选择的高级功能 一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一 ...

  10. DevOps - CI - SVN

    SVN http://tortoisesvn.net/ 支持文档:http://tortoisesvn.net/support.html 在线TortoiseSVN 中文文档:http://torto ...