惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
雷峰网
雷峰网
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
B
Blog
Y
Y Combinator Blog
WordPress大学
WordPress大学
Microsoft Azure Blog
Microsoft Azure Blog
小众软件
小众软件
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
量子位
The Cloudflare Blog
T
The Blog of Author Tim Ferriss
博客园_首页
B
Blog RSS Feed
Hugging Face - Blog
Hugging Face - Blog
IT之家
IT之家
阮一峰的网络日志
阮一峰的网络日志
L
LangChain Blog
宝玉的分享
宝玉的分享

博客园 - Gavin Liu

sp_MSforeachtable 与 sp_MSforeachdb Microsoft SQL Server 数据库服务器管理维护角色 HttpHander与httpModel配置与应用 镜像数据库日志截断方法 SQL Server 2008连接字符串写法大全 .net 事务处理的三种方法 SQLServer游标(Cursor) (B) SQLServer 游标 (A) 无光驱在32位windows系统下安装64位windows系统 Create a SQL Server Database on a network shared drive Sql server 2008镜像配置步骤 android adb shell dumpsys 如何获取SQLite最新版本及SQLite数据库中的SQL语句解说 sqlite错误 The database disk image is malformed database disk image is malformed 可解决 Xml中SelectSingleNode方法中的xpath用法[转] 利用ASP在线压缩access数据库 英文 视频 老友记 第一季 第二季 第三季 第四季 第五季 第六季 第七季 第八季 第九季 第十季 几个好用的webservice SQL Server 2008 中文版安装下载地址
.NET分布式事务处理
Gavin Liu · 2014-04-16 · via 博客园 - Gavin Liu

  在进行数据持久化的时候,我们会经常用到事务处理。一般情况下,ADO.NET中的事务处理就能够满足我们的需要,但是,ADO.NET中的事 务不能同事对多个数据库连接进行原子性的操作;如果在你的业务环境中存在多个数据库、文件写入等操作,同时需要保证数据完整性和一致性的时候,你可以考虑 使用.NET提供的分布式事务处理。

  使用分布式事务处理,需要Windows系统的支持,所以,我们需要将系统的MSDTC服务开启。步骤:管理工具>组件服务;依次展开 控制台根节点>组件服务>计算机>我的电脑;在“我的电脑”节点上右键打开“属性”;在选项卡中勾选“使用本地协调器”,然后点击“确 定”按钮,如下图:

设置完成以后,我们就可以很方便的使用分布式事务处理了。首先,在项目中添加“System.Transactions”引用,然后编写如下代码:

class TransactionEx
    {
        /// <summary>
        /// 用事务执行一个方法,并设置超时时间
        /// </summary>
        /// <param name="action">方法代理</param>
        /// <param name="timeout">超时时间</param>
        public static void InvokAction(Action action, int timeout)
        {
            TransactionOptions transactionOption = new TransactionOptions();
            transactionOption.Timeout = TimeSpan.FromSeconds(timeout);

            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
            {
                action.Invoke();
                scope.Complete();
            }
        }
    }

以上这段代码是执行事务的核心代码,你只需要将要执行代码作为一个委托传入InvokAction,并出入一个超时时间就可以了。在事务执行结尾, 调用Complete方法,可以将事务提交。如果没有调用Complete方法,即使事务执行完成,也不会进行提交。如果出现异常,所有代码都不会改变。

----------------------------------------------------------

ps:

1.还发现一个问题,数据库也需要开启分布式事务的支持:右键“服务器连接”的属性,在打开的属性窗口选择“连接”,在窗口右侧,勾选“需要将分布式事务用于服务器到服务器的通信”,确定即可。

2.需要打开分布式的端口,端口号是135,或者添加System32下msdtc.exe的例外。

3.跨域的情况有待考究。

4.在事务中,即使存在嵌套的情况,同一个事务内的所有数据库连接对数据都是可访问的。

5.在事务中,如果使用Response.Redirect()方法跳转到其它页面,事务将无法提交!