从报错“无效操作,连接被关闭”探究Transaction的Timeout超时机制
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超时机制的更多相关文章
- DB2读取CLOB字段-was报错:操作无效:已关闭 Lob。 ERRORCODE=-4470, SQLSTATE=null
DB2读取CLOB字段-was报错:操作无效:已关闭 Lob. ERRORCODE=-4470, SQLSTATE=null 解决方法,在WAS中要用的数据源里面配置连个定制属性: progressi ...
- Vmware Pro 14报错:无法连接 MKS: 套接字连接尝试次数太多;正在放弃。
软件环境: 虚拟机软件:VMware Pro 14 母机操作系统:win7 客户机操作系统:CentOS 7 问题详情: 报错:无法连接 MKS: 套接字连接尝试次数太多:正在放弃. ...
- 【已解决】ckfinder_php_3.4.4 IIS 报错 无效请求
ckfinder_php_3.4.4 IIS 报错 无效请求 (Invalid request) Apache 正常,但是在IIS环境下报错,解决方法 设置 C:\Windows\Temp 目录 给 ...
- 【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 ...
- C# 保存PictureBox中的图片到数据库,并从数据库读取图片显示到PictrueBox,解决报错 “无效参数”
下面是两段关键代码: /// <summary> /// 将一张图片转换为字节 /// </summary> /// <param name="img" ...
- 编译时.test文件报错无法解决的方法,关闭test编译
有几次遇到从网上下载到的iOS开源代码编译报错,报错位置为Test Target的源文件,我就挺奇怪我又没做测试为啥会编译Test Target的源文件,之前的暴力解决方法是把Test Target直 ...
- 启动mongodb报错,无法连接mongodb
报错原因如下: MongoDB shell version v3.4.2 connecting to: mongodb://127.0.0.1:27017 --01T12:: W NETWORK [t ...
- Python Django 协程报错,进程池、线程池与异步调用、回调机制
一.问题描述 在Django视图函数中,导入 gevent 模块 import gevent from gevent import monkey; monkey.patch_all() from ge ...
- magento后台登陆被锁定 索引报错的解决:General error: 1205 Lock wait timeout
1. magento在索引的时候用shell,有时候会报错: General error: 1205 Lock wait timeout exceeded 这个时候,是因为行锁的原因,在表中您直接用s ...
随机推荐
- (四)ubuntu学习前传—uboot中对Flash和DDR的管理
1.uboot阶段Flash的分区 (1)所谓分区,就是说对Flash进行分块管理.(2)PC机等产品中,因为大家都是在操作系统下使用硬盘的,整个硬盘由操作系统统一管理,操作系统会使用文件系统帮我们管 ...
- IE浏览器GET传参后台乱码
ie里面 get传递的字符串 为 gb2312 ,后台用的是utf-8类型 所以用 POST传递字符串到后端 否则进行js参数转码 encodeURI(""); 后端解码
- Sqlserver_判断该路径是否存在该文件
declare @result int =0declare @path nvarchar(200)='d:\1.csv'execute master.dbo.xp_fileexist @path ,@ ...
- fedora 14安装经验
初学linux系统,在win7 系统上安装VMware9.0,并用虚拟机安装fedora.安装了好几次,虽然还是没有彻底通透,但也有一点点心得,特地分享一下: 我安装fedora用于嵌入式ARM开发练 ...
- Python类属性详解
在python开发中,我们常常用到python的类,今天就通过实例和大家扒一扒类的属性,一起来看看吧. 类属性 1.类定义后就存在,而且不需要实例化 2.类属性使得相同类的不同实例共同持有相同变量 类 ...
- EF Core » 关系
对初学者理解关系很有用,先留下来,有时间边看边翻译. Caution 注意 This documentation is for EF Core. For EF6.x and earlier relea ...
- before和after的强大
前言:刚学他两个的时候,是用于清除浮动,而且曾单纯的以为俩只有这作用. 但看到几篇博客后,发现自己是多么的无知,他两个的强大远不止于此. 当然,这篇文章大多数是借鉴网上的实例,在加上自己的些许简介而成 ...
- js中的apply和call API
借用网上的一个例子: fun.call(this,arg1,arg2,arg3) fun.apply(this,arguments) this.fun(arg1,arg2,arg3) 三种方法等效. ...
- informix数据库下导出表结构
1)导出数据库中所有的表结构到文件db.sql $>dbschema -d your_database -t all db.sql 2)导出数据库中所有的存储过程到文件db.sql $&g ...
- 通配符+countif()解决大于15位数的计数问题
excel的最大精度是15位,如果一个单元格中存储的数字超过15位,那么函数在计算的时候将会出现问题,它们会将15位之后的数字变成0. 在这种情况下,需要在函数中加入通配符,例如,统计A列中,A1出现 ...