http://msdn.microsoft.com/library/en-us/dnbda/html/daag.asp?frame=true#daag_tsqltransactions

如何利用Transact-SQL执行事务

下列存储过程说明了如何在Transact-SQL过程内执行事务的支金转移操作。

CREATE PROCEDURE MoneyTransfer
@FromAccount char(20),
@ToAccount char(20),
@Amount money
AS
BEGIN TRANSACTION
-- PERFORM DEBIT OPERATION
UPDATE Accounts
SET Balance = Balance - @Amount
WHERE AccountNumber = @FromAccount
IF @@RowCount = 0
BEGIN
RAISERROR('Invalid From Account Number', 11, 1)
GOTO ABORT
END
DECLARE @Balance money
SELECT @Balance = Balance FROM ACCOUNTS
WHERE AccountNumber = @FromAccount
IF @BALANCE < 0
BEGIN
RAISERROR('Insufficient funds', 11, 1)
GOTO ABORT
END
-- PERFORM CREDIT OPERATION
UPDATE Accounts
SET Balance = Balance + @Amount
WHERE AccountNumber = @ToAccount
IF @@RowCount = 0
BEGIN
RAISERROR('Invalid To Account Number', 11, 1)
GOTO ABORT
END
COMMIT TRANSACTION
RETURN 0
ABORT:
ROLLBACK TRANSACTION
GO

该存储过程使用BEGIN TRANSACTION, COMMIT TRANSACTION,和ROLLBACK TRANSACTION状态手工控制事务。

如何编码事务性的.NET类

下述例子是三种服务性的NET类,它们配置或用于自动事务。每个类都带有Transaction属性,它的值将决定是否启动新事务流或者对象是否共享即时调用程序的数据流。这些元素一起工作来执行银行支金转移。Transfer类配置有RequiresNew事务属性,而Debit和Credit类配置有Required属性。这样,在运行的时候三个对象共享同一个事务。

using System;
using System.EnterpriseServices;
[Transaction(TransactionOption.RequiresNew)]
public class Transfer : ServicedComponent
{
[AutoComplete]
public void Transfer( string toAccount,
string fromAccount, decimal amount )
{
try
{
// Perform the debit operation
Debit debit = new Debit();
debit.DebitAccount( fromAccount, amount );
// Perform the credit operation
Credit credit = new Credit();
credit.CreditAccount( toAccount, amount );
}
catch( SqlException sqlex )
{
// Handle and log exception details
// Wrap and propagate the exception
throw new TransferException( "Transfer Failure", sqlex );
}
}
}
[Transaction(TransactionOption.Required)]
public class Credit : ServicedComponent
{
[AutoComplete]
public void CreditAccount( string account, decimal amount )
{
SqlConnection conn = new SqlConnection(
"Server=(local); Integrated Security=SSPI"; database="SimpleBank");
SqlCommand cmd = new SqlCommand("Credit", conn );
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add( new SqlParameter("@AccountNo", account) );
cmd.Parameters.Add( new SqlParameter("@Amount", amount ));
try
{
conn.Open();
cmd.ExecuteNonQuery();
}
catch (SqlException sqlex)
{
// Log exception details here
throw; // Propagate exception
}
}
}
[Transaction(TransactionOption.Required)]
public class Debit : ServicedComponent
{
public void DebitAccount( string account, decimal amount )
{
SqlConnection conn = new SqlConnection(
"Server=(local); Integrated Security=SSPI"; database="SimpleBank");
SqlCommand cmd = new SqlCommand("Debit", conn );
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add( new SqlParameter("@AccountNo", account) );
cmd.Parameters.Add( new SqlParameter("@Amount", amount ));
try
{
conn.Open();
cmd.ExecuteNonQuery();
}
catch (SqlException sqlex)
{
// Log exception details here
throw; // Propagate exception back to caller
}
}
}

转载于:https://www.cnblogs.com/lxinxuan/archive/2006/09/04/494738.html

如何使用Transact-SQL进行事务处理[示例]相关推荐

  1. 交互式SQL(Transact SQL,TSQL)

    交互式SQL(Transact SQL,TSQL) 它是SQL Server的查询语言.提供以下命令: · 创建和数据库对象. · 访问和修改数据. · 数据聚合(aggregation,又称聚集). ...

  2. sql子查询示例_SQL更新查询示例说明

    sql子查询示例 In this article, we're going to learn how to use the SQL update statement - what it is, wha ...

  3. 安装SQL Server 2012示例数据库

    SQL Server的示例数据库是一个非常好的学习数据库的范例,在安装完SQL Server 2012后,默认情况下是不会安装示例数据库的,我们需要自己进行一些安装和设置. 安装Adventure W ...

  4. Transact SQL 常用语句以及函数

    Transact SQL  语 句 功 能  ======================================================================== --数据 ...

  5. mysql count if语句_COUNT分组条件去重的sql统计语句示例(mysql)

    常规情况下的sql分组统计为: select count(1) from 表 where 条件 group by 字段; 但是有时往往需要添加不同的条件已经去重的统计以上语句就不能满足需求. 解决方案 ...

  6. java调用存储过程 sql server_Java中调用SQL Server存储过程示例

    Java中调用SQL Server存储过程示例2007-09-03 08:48来源:论坛整理作者:孟子E章责任编辑:方舟·yesky评论(3) 最近做了个Java的小项目(第一次写Java的项目哦), ...

  7. sql注入语句示例大全_SQL Order By语句:示例语法

    sql注入语句示例大全 Order By is a SQL command that lets you sort the resulting output from a SQL query. Orde ...

  8. sql注入语句示例大全_SQL Group By语句用示例语法解释

    sql注入语句示例大全 GROUP BY gives us a way to combine rows and aggregate data. GROUP BY为我们提供了一种合并行和汇总数据的方法. ...

  9. SQL Server-SQL事务处理(Stransaction)

    ylbtech-SQL Server:SQL Server-SQL事务处理(Stransaction) SQL Server中的SQL事务处理(Stransaction). 1,SQL事务处理(Str ...

  10. sql子查询示例_学习SQL:SQL查询示例

    sql子查询示例 In the previous article we've practiced SQL, and today, we'll continue with a few more SQL ...

最新文章

  1. 输出一个等边三角形(由*拼接),实心或空心,连长为n
  2. python vtk_VTK在python环境下的安装和调用
  3. linux 中断和进程 传递,Linux内核之进程上下文和中断上下文的区别
  4. 最详细的Mask R-CNN论文笔记
  5. mysql log stats_MySQL慢查询之pt-query-digest分析慢查询日志
  6. 【Elasticsearch】推荐一个同步Mysql数据到Elasticsearch的工具
  7. 本周ASP.NET英文技术文章推荐[03/04 - 03/10]
  8. 测试面试题集-Python列表去重
  9. 华科计算机学院三好学生,哲学学院常若帆荣获校“三好学生标兵”称号
  10. vista的启动修复........
  11. SHELL中的变量和参数
  12. 美观实用的BeautifulReport测试报告
  13. u-boot-2010.09-for-tiny6410-v1.0支持sd卡SDHC卡启动
  14. 大数据日志分析Hadoop项目实战
  15. 谷歌浏览器刷新快捷键
  16. 2022社区团购回暖,创新 O2O 生鲜电商新零售解决方案
  17. 360等中概股借壳回归之路,亦是赌徒赌壳之时
  18. 湖北省三甲复审评审资料(2011年版第七章--信息科相关)
  19. 我本人一直以来犯的错误,在看了《Think In Java》后才抓了出来
  20. SEW变频器调试步骤(MoviFit,MoviPro,MoviDrive)电气工程师必备(经10年电气工程师总结内部培训资料)

热门文章

  1. Java多线程300毫秒_Java多线程小程序(输出每个线程的毫秒级时间)-Go语言中文社区...
  2. 拓端tecdat|R语言分段线性回归分析预测车辆的制动距离
  3. 拓端tecdat|Nelsen-Siegel—Svensson扩展模型简介
  4. SET-Priority_Queue
  5. (5)Matplotlib_grid
  6. c primer plus 第七章 第十题
  7. double几位小数_算法竞赛入门之每日一题:分数化化小数(decimal) C语言
  8. 基于ServerSokect和Soket的简易Qq程序
  9. 【Pycharm】连接远程服务器并进行代码上传、调试
  10. 【Caffe代码解析】convert_imageset