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. C#项目 学生选课系统 C#窗口 Winform项目 项目源码及使用说明

    这是一个学生选课信息管理系统,使用VS2010+SQL2008编写,VS2017正常使用. 项目源码下载地址 https://gitee.com/whuanle/xkgl 笔者录了两个视频,打开项目源 ...

  2. ASP.NET MVC的切片(Section)脚本(script)

    在ASP.NET MVC使用切片脚本,实在是很溜. 在使用layout之后,只是视图套用_Layout之后,在视图中任一位置任一时候均可以使用切片脚本. 首先在_Layout.cshtml定一些规则: ...

  3. jdk在Linux下的安装

    之前学linux的时候,也是赶鸭子上架,照着教程一步一步的走,但是今天linux出现了点问题重装一下 重新学习一些linux下常需软件的安装 一般我们再装完系统后,装的匆忙,先把ip搞出来 切换到该目 ...

  4. JAVA多线程下载

    package com.jan.test; import java.io.File; import java.io.IOException; import java.io.RandomAccessFi ...

  5. SpringBoot从入门到逆天(1)

    1.SpringBoot是什么? <1>为Sping开发提供一个更 快捷更广泛的入门体验. <2>开箱即用,不合适时特可以快速抛弃. <3>提供一系列大型项目常用的 ...

  6. BIND DNS拒绝服务漏洞 CVE-2016-2776修复

    接到此漏洞之后,略微查了一下相关描述,发现漏洞影响范围很大,可能造成的影响也很严重,于是着手进行修复. 漏洞的详细信息可见如下链接: http://www.cnvd.org.cn/flaw/show/ ...

  7. mysql 常用操作命令

    mysql官网指南:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html 1.导出整个数据库mysqldump -u 用户名 -p --defa ...

  8. storm_分组策略

      注意1:原始的案例 spout 和bolt都是1个并发  所以文件中30条日志 从spout发出以后 bolt接受到30条

  9. OwinHost

    新建ASP.NET MVC 项目. 引用包: install-package Microsoft.Owin.Host.SystemWeb 修改 public class Startup { publi ...

  10. JVM(二)JVM的结构

    1.JVM的结构包括 (1)类加载器 (2)执行引擎 (3)运行时数据区 (4)本地库接口 类加载器:包括启动类加载器.扩展类加载器.应用程序类加载器.自定义加载器. 执行引擎:在执行JAVA代码的时 ...