1、报错如下:Invalid Operation the connection is closed,无效操作,连接被关闭。这个错误是并不是每次都报,只有在复杂操作、大事务的情况下才偶然报出来。

stackOverflow上有很多关于这个问题的讨论,例如这个:《System.Data.OracleClient random Invalid Operation the connection is closed》,但较零散,全扫了一遍之后,我仍然有如下疑问:

1)怎么看TransactionScope里的Timeout到底是多少,比如通过TransactionOptions.Timeout = new TimeSpan(0,0,3)设置之后,怎么知道TransactionScope里的超时就是3s?

2)默认MaxTimeout=10m,怎么才能设置任意值?

3)嵌套事务的外层超时是否包括所有内层事务的时间?

4)超时机制是怎么起作用的?

通过Reflector之类的工具查看源码,终于有了初步的理解,不对的地方,请大家指正!

2、怎么看TransactionScope里的Timeout?

用调试器逐级展开TransactionScope实例如下:

scope->committableTransaction->base->internalTransaction->absoluteTimeout //注:这是展开过程,不是代码

这个absoluteTimeout就是实际结果,但往往与你设置的值不匹配,比如:

TimeSpan absoluteTimeout
3s 5
10s 19
1m 117
10m 1171
30m 3515
1h 7031

看起来是经过某个算法转换后的值,这个算法写在TransactionTable.TimeoutTicks()里:

internal long TimeoutTicks(TimeSpan timeout){
if(timeout != TimeSpan.Zero) {
return (timeout.Ticks / 10000L >> ) + this.ticks;
}
return 9223372036854775807L;
}

这就清楚了,再加上上面那张对照表,就可以通过absoluteTimeout清楚知道设置是否生效。

3、默认MaxTimeout=10m,怎么才能设置任意值?

1)先说一下这个10m怎么来的?

TransactionScope.ctr()->TransactionManager.ValidateTimeout()->MaximumTimeout->MachineSettingsSection.MaximumTimeout

这个属性先读取c:\windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config里的值://注意对应的framework的版本!

<system.transactions>
<machineSettings maxTimeout="00:10:00" />
</system.transactions>

当然,我查看下来,所有版本的machine.config里默认都没有这个节点。那么退一步,由Attribute设置默认值:

[ConfigurationProperty("maxTimeout", DefaultValue = "00:10:00")]
public TimeSpan MaxTimeout

2)再说一下怎么改成任意值?

2.1)修改machine.config,优点:方便,缺点:会影响机器上的所有事务。方法是在全局的machine.config里添加对应节点,注意在自己的app/web.config里添加<machineSettings>节点会报错。

2.2)用反射(神器)!优点:只作用于自己的事务,缺点:用反射、稍麻烦、稍慢。

static void ChangeMaximumTimeout() {
Type t = typeof(TransactionManager);
FieldInfo f = t.GetField("_cachedMaxTimeout", BindingFlags.NonPublic | BindingFlags.Static);
f.SetValue(null, true);
f = t.GetField("_maximumTimeout", BindingFlags.NonPublic | BindingFlags.Static);
f.SetValue(null, new TimeSpan(, , ));
}

这么写是因为最终大家取的都是static类里的static属性:

public static class TransactionManager {
public static TimeSpan MaximumTimeout {
get {
if(!_cachedMaxTimeout) {
_maximumTimeout = MachineSettings.MaxTimeout;
}
return _maximumTimeout; }}}

贴出来,一目了然!

4、嵌套事务的外层超时是否包括所有内层事务的时间?

我理解外层超时包含所有内层事务的执行时间,测试代码如下:

option.Timeout = new TimeSpan(,,);
using(var scope = new TransactionScope(TransactionScopeOption.Required, option)) {
Thread.Sleep(); option1.Timeout = new TimeSpan(,,);
using(var scope1 = new TransactionScope(TransactionScopeOption.Required, option)) {
Thread.Sleep(); // 800以上基本就报超时错误了
}}

5、超时机制是怎么起作用的?

1)对于非根(committableTransaction == null)的事务,会构造一个scopeTimer = new Timer(timeSpan, TimeoutCallback)来触发超时回滚;

2)对于committableTransaction != null的根事务,超时机制尚未找到,有待补充完整。

从报错“无效操作,连接被关闭”探究Transaction的Timeout超时机制的更多相关文章

  1. DB2读取CLOB字段-was报错:操作无效:已关闭 Lob。 ERRORCODE=-4470, SQLSTATE=null

    DB2读取CLOB字段-was报错:操作无效:已关闭 Lob. ERRORCODE=-4470, SQLSTATE=null 解决方法,在WAS中要用的数据源里面配置连个定制属性: progressi ...

  2. Vmware Pro 14报错:无法连接 MKS: 套接字连接尝试次数太多;正在放弃。

    软件环境: 虚拟机软件:VMware Pro 14 母机操作系统:win7 客户机操作系统:CentOS 7     问题详情: 报错:无法连接 MKS: 套接字连接尝试次数太多:正在放弃.     ...

  3. 【已解决】ckfinder_php_3.4.4 IIS 报错 无效请求

    ckfinder_php_3.4.4 IIS 报错 无效请求 (Invalid request) Apache 正常,但是在IIS环境下报错,解决方法 设置 C:\Windows\Temp 目录 给 ...

  4. 【spring data jpa】使用spring data jpa 的删除操作,需要加注解@Modifying @Transactional 否则报错如下: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call

    使用spring data jpa 的删除操作,需要加注解@Modifying     @Transactional 否则报错如下: No EntityManager with actual tran ...

  5. C# 保存PictureBox中的图片到数据库,并从数据库读取图片显示到PictrueBox,解决报错 “无效参数”

    下面是两段关键代码: /// <summary> /// 将一张图片转换为字节 /// </summary> /// <param name="img" ...

  6. 编译时.test文件报错无法解决的方法,关闭test编译

    有几次遇到从网上下载到的iOS开源代码编译报错,报错位置为Test Target的源文件,我就挺奇怪我又没做测试为啥会编译Test Target的源文件,之前的暴力解决方法是把Test Target直 ...

  7. 启动mongodb报错,无法连接mongodb

    报错原因如下: MongoDB shell version v3.4.2 connecting to: mongodb://127.0.0.1:27017 --01T12:: W NETWORK [t ...

  8. Python Django 协程报错,进程池、线程池与异步调用、回调机制

    一.问题描述 在Django视图函数中,导入 gevent 模块 import gevent from gevent import monkey; monkey.patch_all() from ge ...

  9. magento后台登陆被锁定 索引报错的解决:General error: 1205 Lock wait timeout

    1. magento在索引的时候用shell,有时候会报错: General error: 1205 Lock wait timeout exceeded 这个时候,是因为行锁的原因,在表中您直接用s ...

随机推荐

  1. Windows的命令行查看,修改,删除,添加环境变量

    查看当前所有可用的环境变量:输入 set 即可查看. 显示某环境变量: 例如:echo %SystemDrive% 类似linux下面的echo $PATH这种用法. 首先明确一点:所有的在cmd命令 ...

  2. 巧妙的实现 CSS 斜线(炫酷的小效果)

      开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果 ...

  3. git的作用和原理(待续)

    先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令: $ sudo git init --bare sample.git Git就会创建一个裸仓库,裸仓库没有 ...

  4. 免费在线客服QQ_网页接入及使用说明

    首先,注册一个QQ (haha,我觉得也是废话) 到QQ推广的网站设置,生成代码 链接:http://shang.qq.com/v3/widget.html 选择“免费开通”,然后就会看到下图,一般只 ...

  5. Bootstrap文本对齐风格

    在排版中离不开文本的对齐方式.在CSS中常常使用text-align来实现文本的对齐风格的设置.其中主要有四种风格: ☑  左对齐,取值left ☑  居中对齐,取值center ☑  右对齐,取值r ...

  6. 转!!MAC和PHY的区别

    一块以太网网卡包括OSI(开方系统互联)模型的两个层,物理层和数据链路层.物理层定义了数据传送与接收所需要的电与光信号.线路状态.时钟基准.数据编码和电路等,并向数据链路层设备提供标准接口.数据链路层 ...

  7. matlab中图像显示函数

    image函数是显示图像的最基本的方法.该函数还产生了图像对象的句柄,并允许对对象的属性进行设置. imagesc函数也具有image的功能,所不同的是imagesc函数还自动将输入数据比例化,以全色 ...

  8. mysql:恢复mysql表结构

    mysql,frm格式恢复mysql表结构,以tuser.frm格式为例   新增数据库,如下,创建数据库名为ab   打开数据库,双击打开数据库   点右键新建表结构   新增表,里面只添加一个字段 ...

  9. vitamio videoView 用隐藏除videoview的控件,并旋转屏幕方向实现的全屏功能,出现的画面不能填充满videoview(画面不完整)

    使用vitamio 封装的播放器 当切换到全屏模式,有时候会出现播放的画面不是全屏的情况, 全屏时,画面只占左半部分并出现拉伸效果,还显示不全,等等其他情况 阅读分析源代码发现是getHolder() ...

  10. javaweb2 URL(查找的过程)

    URL: 全名叫统一资源定位符,用于定位互联网的资源. 问题:接上(javaweb1 tomcat)http://localhost:8080/myweb/test.html 分析:http://-- ...