事务特点: 只需要把需要事务包裹的逻辑块写在using (TransactionScope ts = new TransactionScope())中。除非显示调用ts.Complete()方法。否则,系统不会自动提交这个事务。如果在代码运行退出这个block后,还未调用Complete(),那么事务自动回滚了。在事务块中,操作数据库方法内部都没有用到任何事务类。(都是自动生成的事务操作)
事务原理:TransactionScope 会将当前的 Transaction 存储到线程静态字段中。当稍后实例化 SqlCommand 时(在此 TransactionScope 从线程局部存储中删除之前),该 SqlCommand 会检查线程静态字段以查找现有 Transaction,如果存在则列入该 Transaction 中。通过这种方式,TransactionScope 和 SqlCommand 能够协同工作,从而开发人员不必将 Transaction 显示传递给 SqlCommand 对象。TransactionScope是基于当前线程的。
DTC:对于多个不同服务器之间的数据库操作,TransactionScope依赖DTC(Distributed Transaction Coordinator)服务完成事务一致性。 系统会判定是否是对多个数据库进行操作,如果是,就会依赖DTC ,(两种不同的数据库连接字符串或者两种不同方法创建的连接,也可能会被认为是不同的数据库从而启用DTC,此时如果DTC配置不当就会报错)
事务介绍原文:http://www.tuicool.com/articles/qaMzIb
关于DTC的配置:1、可以用DTCPing.exe软件测试两端是否正常连通
2、DTC是依赖机器名解析IP的 所以应尽量使双方在一个网段里(网上邻居可见),如不可见,可以选择 计算机--》网络--》启用网络发现和文件共享。
3、如果不行,可以在当前网络连接中的 属性--》IPV4-->属性--》高级--》WINS--》NetBois设置--》默认 【DHCP 动态IP】 或启用TCP/IP上的NetBois 【静态IP】(有可能导致RPC服务器不可用,如果不可用就换默认)
4、如果不在一个网段或者还不行,可以在C:\Windows\System32\drivers\etc\host文件中添加 对方的ip以及计算机名 最后一行要加回车否则读取不到 (注意前面不要有#)
5、此时双方应该可以通过DTCPing 找到对方了 如果还不行,尝试从路由器上设置DNS。 第一步完成(解析计算机名为IP)
6、 第二部 RPC访问权限 :编辑策略组(gpedit.msc)-》管理模板--》系统--》远程过程调用--》限制未验证的RPC客户端--》编辑-》启用--》 要应用的RPC运行时未验证的客户端限制 设置为无 此时第二部RPC验证完成。
7、 其他配置项 :(1)启动服务Distributed Transaction Coordinator (MSDTC) Remote Procedure Call (RPC)
(2) 关闭防火墙(或添加对应的例外)
(3)组件服务:组件服务--》计算机--》我的电脑--》Distributed Transaction Coordinator--》本地DTC-->属性--》安全 把能开的权限都打开
事务示例 代码:
using (TransactionScope ts = new TransactionScope()) { userBLL u = new userBLL(); TeacherBLL t = new TeacherBLL(); u.ADD();//第一个数据库操作 t.ADD();//第二个数据库操作 ts.Complete();//提交事务 }