WCF学习笔记(八)服务模式下的简单事务实例和非事务实例对比
来源:互联网 发布:java文件上传插件下载 编辑:程序博客网 时间:2024/05/18 00:53
1.契约
[ServiceContract]
public interface IWCFServicesTransaction
{
/*服务模式下,服务必须启动一个根事务,且不参与外部事务 */
[OperationContract]
[TransactionFlow(TransactionFlowOption.NotAllowed)]
bool AddData(string name);
[OperationContract]
bool AddDataEx(string name);
}
2.接口实现
注意:在TransactionScope 块下的,即是在事务模式下的添加数据库操作,需要没有异常才能把数据更新到数据库,在非事务模式直接更新进数据库
public class WCFServicesTransaction : IWCFServicesTransaction
{
#region IWCFServicesTransaction 成员
/// <summary>
/// 这就是一个根事务
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
[OperationBehavior(TransactionScopeRequired=true)]
public bool AddData(string productName)
{
//获取事务环境
Transaction transaction = Transaction.Current;
//DistributedIdentifier:获取升级的事务的唯一标识符。
//若是等于00000-0000就是个本地事务
Debug.Assert(transaction.TransactionInformation.DistributedIdentifier == Guid.Empty);
//LocalIdentifier:本地事务标示
//若是断言不等后面就不执行了,进程就阻塞在这个地方
//Debug.Assert(transaction.TransactionInformation.LocalIdentifier == Guid.Empty.ToString());
Console.WriteLine("本事务创建时间:{0}",transaction.TransactionInformation.CreationTime);
Console.WriteLine("本事务状态:{0}", transaction.TransactionInformation.Status);
Console.WriteLine("本事务本地事务标示:{0}", transaction.TransactionInformation.LocalIdentifier);
//DistributedIdentifier:全局事务
Console.WriteLine("本事务升级的事务的标示:{0}", transaction.TransactionInformation.DistributedIdentifier);
//创建事务执行范围
using(TransactionScope ts=new TransactionScope())
{
try
{
DBHelper db = new DBHelper();
Products p = new Products();
p.ProductID = 1235;
p.ProductName = productName;
Console.WriteLine("调用事务,传入的数据是:{0},长度:{1}", productName, productName.Length);
db.AddProducts(p);
if (productName.Length > 5)
{
Exception ex = new Exception();
ExceptionDetail exdetail = new ExceptionDetail(ex);
throw new FaultException<ExceptionDetail>(exdetail, "名字太长");
}
}
catch (Exception e)
{
transaction.Rollback();
Console.WriteLine("调用服务出错:{0}", e.Message);
return false;
}
ts.Complete();
return true;
}
}
#endregion
#region IWCFServicesTransaction 成员
public bool AddDataEx(string productName)
{
try
{
DBHelper db = new DBHelper();
Products p = new Products();
p.ProductID = 1234;
p.ProductName = productName;
Console.WriteLine("调用事务,传入的数据是:{0},长度:{1}", productName, productName.Length);
db.AddProducts(p);
if (productName.Length > 5)
{
Exception ex = new Exception();
ExceptionDetail exdetail = new ExceptionDetail(ex);
throw new FaultException<ExceptionDetail>(exdetail, "名字太长");
}
}
catch (Exception e)
{
Console.WriteLine("调用服务出错:{0}", e.Message);
return false;
}
return true;
}
#endregion
}
3.客户端调用(调用方式见WCF学习笔记(二))
static void Main(string[] args)
{
WCFServicesTransactionClient client = new WCFServicesTransactionClient();
//try
//{
// client.AddData("yoyoyo");
// Console.WriteLine("数据添加完成");
//}
//catch(Exception ex)
//{
// Console.WriteLine("服务调用异常:{0}",ex.Message);
//}
try
{
client.AddDataEx("yoyoyo");
Console.WriteLine("数据添加完成");
}
catch (Exception ex)
{
Console.WriteLine("服务调用异常:{0}", ex.Message);
}
Console.ReadKey();
}
- WCF学习笔记(八)服务模式下的简单事务实例和非事务实例对比
- WCF学习--WCF服务实例模式
- Apache Camel异常事务的实例和分析 -- 多线程事务
- php中事务简单实例
- 基于spring事务简单实例
- 事务实例
- Redis学习笔记八、事务
- sqlite3事务和锁的实例
- 简单的WCF实例
- JTA和JDBC事务实例
- JTA和JDBC事务实例
- [WCF 学习笔记] 13. 分布事务
- rocketmq学习笔记 二 官方实例<分布式事务>
- 工作流管理与事务服务实例
- Redis学习笔记(八)事务 和 连接相关命令
- Redis学习笔记(八)事务 和 连接相关命令
- SQLite3开启事务和关闭事务模式下,性能测试对比
- sqlite3的事务功能实例
- vcs常用命令使用详解
- RMAN 验证 数据文件 和 备份 的有效性
- MASM汇编语言笔记(二)汇编语言基础
- 2012腾讯校园招聘面试经历
- 注意string自定义的赋0截断
- WCF学习笔记(八)服务模式下的简单事务实例和非事务实例对比
- 存储过程
- 经典笑话(4)
- 问题这个概念
- 随想
- Java泛型相关问题
- MASM汇编语言笔记(三)数据传送和算术运算
- linux+shell+脚本+过滤NetScreen防火墙日志
- socket通信数据量大小限制