class

 //student
[Serializable]
public class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Company { get; set; }
public int Id { get; set; } public override string ToString()
{
return String.Format("{0} {1}", FirstName, LastName);
}
} //student 处理类
public async Task AddStudentAsync(Student student, Transaction tx)
{
SqlConnection connection = new SqlConnection(Settings.Default.CourseConnection);
await connection.OpenAsync();
try
{
if (tx != null)
connection.EnlistTransaction(tx);
SqlCommand command = connection.CreateCommand();
command.CommandText = "INSERT INTO Students (FirstName, LastName, Company) " +
"VALUES (@FirstName, @LastName, @Company)";
command.Parameters.AddWithValue("@FirstName", student.FirstName);
command.Parameters.AddWithValue("@LastName", student.LastName);
command.Parameters.AddWithValue("@Company", student.Company);
await command.ExecuteNonQueryAsync();
}
catch (Exception ex)
{
Trace.WriteLine("AddStudentAsync(Student student, Transaction tx) Error :" + ex.Message);
throw;
}
finally
{ connection.Close(); }
} //操作类
public static class Utilities
{
public static bool AbortTx()
{
Console.Write("Abort the Transaction (y/n)?");
return Console.ReadLine().ToLower().Equals("y");
}
public static void DisplayTransactionInformation(string title, TransactionInformation ti)
{
Contract.Requires<ArgumentNullException>(ti != null); Console.WriteLine(title);
Console.WriteLine("Creation Time: {0:T}", ti.CreationTime);
Console.WriteLine("Status: {0}", ti.Status);
Console.WriteLine("Local ID: {0}", ti.LocalIdentifier);
Console.WriteLine("Distributed ID: {0}", ti.DistributedIdentifier);
Console.WriteLine();
}
}

执行类

   static void Main(string[] args)
{
Task t= CommittableTransactionAsync();
t.Wait();
}
static async Task CommittableTransactionAsync()
{
var tx = new CommittableTransaction();
Utilities.DisplayTransactionInformation("TX created", tx.TransactionInformation); try
{
var s1 = new Student() { FirstName = "Stephanie", LastName = "Nage1", Company = "China" };
var db = new StudentData();
await db.AddStudentAsync(s1,tx); var s2 = new Student() { FirstName = "Stephanie2", LastName = "Nage2", Company = "China" };
await db.AddStudentAsync(s2, tx); Utilities.DisplayTransactionInformation("2nd connection enlisted ", tx.TransactionInformation); if(Utilities.AbortTx())
{
throw new ApplicationException("transaction abort");
}
tx.Commit();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine();
tx.Rollback();
}
Utilities.DisplayTransactionInformation("TX completed", tx.TransactionInformation);
}

C# Transaction 事务处理的更多相关文章

  1. C# Transaction 事务处理 -依赖事务

    在DependentTransaction()方法中,实例化CommittableTransaction类,创建一个根事务,显示事务的信息.接着, tx.DependentClone()方法创建一个依 ...

  2. C# Transaction 事务处理 -环境事务

    一.TransactionScope 环境事务 static async Task TransactionScopeAsync() { using (var scope = new Transacti ...

  3. word20161222

    T.120 tag / 标记 TAPI, Telephony API / 电话 API target journaling / 目标日志 taskbar / 任务栏 taskbar button / ...

  4. SQL标签

    SQL标签库提供了与关系型数据库进行交互的标签. 引入语法:<%@ taglib prefix="sql" uri="http://java.sun.com/jsp ...

  5. (火炬)MS SQL Server数据库案例教程

    (火炬)MS SQL Server数据库案例教程 创建数据库: CREATE DATABASE TDB //数据库名称 ON ( NAME=TDB_dat,//逻辑文件名 在创建数据库完成之后语句中引 ...

  6. MySQL (八)

    1 事务 需求:有一张银行账户表,A用户给B用户转账,A账户先减少,B账户增加,但是A操作完之后断电了. 解决方案:A减少钱,但是不要立即修改数据表,B收到钱之后,同时修改数据表. 事务:一系列要发生 ...

  7. MySQL (八)-- 事务、变量、触发器

    1 事务 需求:有一张银行账户表,A用户给B用户转账,A账户先减少,B账户增加,但是A操作完之后断电了. 解决方案:A减少钱,但是不要立即修改数据表,B收到钱之后,同时修改数据表. 事务:一系列要发生 ...

  8. MySQL完整教程(共8章)

    正文 [第一章] 回到顶部 1.1 MySQL学习路线 基础阶段:MySQL数据库的基本操作(增删改查),以及一些高级操作(视图.触发器.函数.存储过程等). 优化阶段:如何提高数据库的效率,如索引, ...

  9. 物联网架构成长之路(17)-SpringCloud目前遇到的注意事项

    1. STS插件最好是要安装的. 2. 对应的Decompiler插件也是要安装的. 3. 如果遇到maven工程因为找不到包问题的, 在确认pom.xml 文件没有问题的情况下, 右键项目-Mave ...

随机推荐

  1. airflow安装rest api插件发现airflow webserver服务不能启动的解决办法

    安装插件airflow-rest-api 1)获取 wget https://github.com/teamclairvoyant/airflow-rest-api-plugin/archive/ma ...

  2. Redis服务监控之RedisLive安装部署(亲测可用)

    一.Redis服务安装部署 1.redis安装(linux系统) 下载 https://redis.io/ 安装依赖 yum install gcc tcl 解压.编译.安装(make & m ...

  3. 并发艺术--java并发机制的底层实现原理

    前言 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令. 一 ...

  4. 基于AbstractRoutingDataSource实现动态切换数据源

    基于AbstractRoutingDataSource实现动态切换数据源 /**  * DataSource注解接口  */ @Target({ElementType.TYPE, ElementTyp ...

  5. 笔记-5:mysql数据更新

    1.插入数据 1.1 插入完整的数据 # 语法格式: INSERT INTO tb_name(column_list) VALUES(value_list); tb_name:指定要插入数据的表名. ...

  6. Python--一些基础内容

    1. Content-Type是什么? Content-Type描述的只是发送端;发送端既可以是服务器也可以是客户端;Content-Type代表发送端发送的实体数据的数据类型.比如:Content- ...

  7. Merkle树

    在分布式系统.P2P应用中或者是区块链中,会经常使用一种数据结构Merkle tree(默克尔树),这里我们将详细讨论一下这个常用数据结构. Merkle tree Merkle树看起来非常像二叉树, ...

  8. 字符串的简单操作----记录次数 hdu2617

    统计出字符串中共能拼凑出多少happy.happy相对次序不变. #include<cstdio> #include<iostream> #include<string. ...

  9. NavigatorOnLine.onLine——判断设备是否可以上网

    概述:返回浏览器的联网状态.正常联网(在线)返回true,不正常联网(离线)返回false.一旦浏览器的联网状态发生改变,该属性值也会随之变化. 1.语法 let online = window.na ...

  10. 0.a开始数据结构征程

    决定开始从mooc和ppt上学习数据结构,......书暂时不看.在进入数据结构之前,我首先将自己以一个还未进入大山但又向往山中美景的探险者身份对数据结构的几点疑问的答案的寻找和思考写在下面. 什么是 ...