transactionscope死锁 中若有http请求,失败后是否会自动回滚

e 含义 无法改写隔离级别更高的事务中的挂起的更改。 在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。即在事务期间未提交的数据不能读出,但能被修改。 可以进行脏读,意思是说,不发布共享锁,也不接受独占锁。即在事务期间未提交的数据既能读出也能修改。要记住数据可以修改:不能保证该数据和随后读取的数据是相同的。 在查询中使用的所有数据上放置锁,以防止其他用户更新这些数据。防止不可重复的读取,但是仍可以有幻像行。即在事务期间未提交的数据能读出但不能修改。但是,能插入新数据。 在DataSet上放置范围锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行。未提交的数据能读出但不能修改,在事务期间不能插入新数据。
通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。Snap
shot 表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。即未提交的数据能读出,但在事务真正修改数据之前,该事务会验证在它最初读取数据后其它事务没有修改该
数据。假如数据被修改了,该事务就激发员工错误。这样做的目的是让事务能读取先前提交的数据值。
正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。当使用OdbcTransaction时,如果不设置IsolationLevel或者将IsolationLevel设置为Unspecied,事务将根据基础ODBC驱动程序的默认隔离级别来执行。假如你试图设置事务隔离级别为该值,那么就会抛出一个异常。只有事务系统能设置该值。 Unspecified
当你拖拽一个TransactionScope活动到你的工作流中后,隔离级别会自动设置为Serializable。根据你的架构要求,你可不受限制地改变它。Serializable是最严格的隔离级别。但是它也在一定程度上限制了可扩展性。对要求吞吐量更大一些的系统而言,选择ReadCommitted来作为隔离级别并不是稀罕事,但是这要根据你的个人需求来做决定。
假如你正使用的是SQL Server事务,或者可能是COM+事务,你就知道一旦数据已被插入、更新或删除,你就必须提交该事务。也就是说,你启动两阶段提交协议和数据库来永久记录或移除这些数据。
但是,对于TransactionScope活动而言不是必要的。假如事务执行成功(当插入、更新、删除数据时没有出错),当工作流执行过程离开该事务范围时,该事务会为你自动提交。
怎么样回滚失败的事务呢?哦,就像事务成功为你提交一样,假如事务失败数据也将被回滚。有趣的是回滚是悄无声息的,至少就WF而言是很关注的。假如你需要检查事务是成功还是失败,你就需要亲自加入逻辑代码来完成这件事。假如事务失败,
TransactionScope是不会自动抛出异常的。它仅仅回滚数据然后继续前进。
使用CompensatableTransactionScope活动
假如XA类型的事务不能胜任,你可以拖拽CompensatableTransactionScope活动到你的工作流中来提供补偿式的事务处理过程。CompensatableTransactionScope活动和TransactionScope一样是一个组合活动。但是,CompensatableTransactionScope实现了ICompensatableActivity接口,通过实现Compensate方法赋予了它能对失败的事务进行补偿的能力。
和TransactionScope相似,CompensatableTransactionScope活动也创建一个环境事务。包含进CompensatableTransactionScope的活动共享这个事务。假如它们操作都成功,数据就被提交。但是,如果它们中任何一个操作失败,你通常通过执行一个Throw活动去启动补偿。
提示:补偿式事务能支持像数据库之类的传统资源,当事务提交时,数据就像以XA类型的事务一样被提交。但是,补偿式事务的优点是你不必选择一个XA类型的资源来存储数据。对于不支持传统资源的一个典型例子是使用一个Web服务来把数据发送到一个远程站
看过本文章的还看过。。。
其中 transactionscopeoption.requiresnew 会使得当前的 transaction.current.transactioninformation.localidentifier 发生变化, 也就是说使用的是新的一个事务;另外,这里.........
c#事务sqltransaction ,transactionscope的用法_计算机软件及应用_it计算机_专业资料...下面介绍sqltransaction的使用方法。sqltransaction是system.data.sqlclient命名空间下.........
net framework 0 版中新增的 transactionscope 单独使用确实很方便。但是在实际项目 中都有自己的访问层,如何才能和自己的数据访问层结合起来使用呢? 在项目中我.........
使用compensatablesequence活动_计算机软件及应用_it计算机_专业资料。使用compensa...sequence 活动 中,但是它们不能作为 compensatabletransactionscope 活动的子活动.........
事务状态部分 提交状态 提交状态 活动状态 最后一条语 句被执行后 成功完成,永...用transactionscope来完成 ? 对每个数据库 page 18 示例代码 ? sqlconnection .........
wfactivitys——工作流活动层 定义了工作流中使用的活动 业务的最小逻辑单元...的使用 首先,引用“using system.”命名空间,调用transactionscope类 .........
wfactivitys——工作流活动层 定义了工作流需要的活动,使用微软 wf 技术。 wf...(业务逻辑层)消息类的业务逻辑写在bll类库中, 事务使用transactionscope对象, .........
事务的使用 首先,引用“using system.”命名空间,调用transactionscope...工作流设计器 工作流活动 业务处理 业务实体 数据访问层 其他应用程 序服务 .........
批处理级事务 只能应用于多个活动结果集 (mars),在 mars 会话中启动的 ...(u1); dbusers.insertonsubmit(u2);
使用transactionscope对象,使代码块.........
? ? 而在处理分布式事务操作的时候,就有必要使用 transactionscope 来处理了,很多时候我们会这样写: using (transactionscope scope = new transactionscope()) { .........
activity、whileactivity和parallelactivity,可以用这种方法来添加“多个”子活动。...? transactionscopeactivity ? compensatabletransactionscopeactivity和compensatable.........
()方法的使用 12 多活动结果集 mars:设置参数 multipleactiveresultsets 14 ...()方法回 滚事务 4 分布式事务:transactionscope 对象使用,complete()方法提交.........
处理分布式事务还用到了 msdtc。隐式事务处理程序编写模型 transactionscope 类 ...一起来学广场舞 广场舞活动方案 社区广场舞策划方案 广场舞有益于身心健康文档.........
8 net事务使用 2 net事务使用 要使用transactionscope范围事务要增加引用 system.transactions. 假如我们对签到类型表checktype先进行插入操作,再 执行一个.........
处理分布式事务还用到了 msdtc。隐式事务处理程序编写模型 transactionscope 类 system.transaction s 显式事务处理程序编写模型 committabletransaction 隐式事务处理.........
transactionscope 的概念 transactionscope 存在于 system.transactions 命名空间中, 它是从 framework 0 开始引入的一个事务管理类,它也是微软推 荐使用的一个事务.........
所以他们都要在自己的范围内活动,不能被其它的层次...其实我们完全可以利用 transactionscope 这一.net ...b.公共模块 a) 设计者把系统中使用到的公共代码和.........
transactionscope 的概念 transactionscope 存在于 system.transactions 命名空间中, 它是从 framework 0 开始引入的一个事务管理类,它也是微软推 荐使用的一个事务.........
使用事务:使用事务很简单,只要把需要的操作放在 transactionscope 中,最后提交 dbentity db = new dbentity(); using (var scope = new transactionscope()) {.........
为避免这种情况,应该利用“交易处理”(使用transactionscope 类)......
■ 24小时热门信息
批处理级事务 只能应用于多个活动结果集 (mars),在 mars 会话中启动的 ...(u1); dbusers.insertonsubmit(u2);
使用transactionscope对象,使代码块.........
? ? 而在处理分布式事务操作的时候,就有必要使用 transactionscope 来处理了,很多时候我们会这样写: using (transactionscope scope = new transactionscope()) { .........
activity、whileactivity和parallelactivity,可以用这种方法来添加“多个”子活动。...? transactionscopeactivity ? compensatabletransactionscopeactivity和compensatable.........
()方法的使用 12 多活动结果集 mars:设置参数 multipleactiveresultsets 14 ...()方法回 滚事务 4 分布式事务:transactionscope 对象使用,complete()方法提交.........
■ 相关热门内容
■ 热门推荐使用TransactionScope时出现“与基础事务管理器的通信失败”的错误
来源:csdn
【在使用TransactionScope时 出错。(如果不使用事务则不出错)
以下是使用TransactionScope 这个的测试代码一周了,问题仍然没有解决,希望大家指教。
应用程序服务器与数据库服务器分别在不同的机器上。
string connectionString = @"Data Source=server\sql2005;Initial Catalog=DataTUser ID=Password=123456;enlist=true";
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
SqlParameter[] parameters =
new SqlParameter("@UserName", SqlDbType.NVarChar,50),
new SqlParameter("@Fund", SqlDbType.Money)
parameters[0].Value = "admin";
parameters[1].Value = 12.0;
using (SqlConnection conn = new SqlConnection(connectionString))
SqlCommand cmd = new SqlCommand();
cmd.Connection =
mandType = CommandType.StoredP
mandText = "User_UpdateFund";
cmd.Parameters.AddRange(parameters);
conn.Open();
cmd.ExecuteNonQuery();
using (SqlConnection conn1 = new SqlConnection(connectionString))
SqlParameter[] parameters1 =
new SqlParameter("@From", SqlDbType.NVarChar,50),
new SqlParameter("@To",SqlDbType.NVarChar,50),
new SqlParameter("@Fund", SqlDbType.Money)
parameters1[0].Value = "admin";
parameters1[1].Value = "agent";
parameters1[2].Value = 12.0;
SqlCommand cmd1 = new SqlCommand();
cmd1.Connection = conn1;
mandType = CommandType.StoredP
mandText = "FundLog_Add";
cmd1.Parameters.AddRange(parameters1);
conn1.Open();
cmd1.ExecuteNonQuery();
ts.Complete();】
jiangsheng:
/dataaccess/archive//532026.aspx
rosanshao:
楼上的意思是说,只能使用一个Connection对象吗?
jiangsheng:
你也可以在服务器上启用DTC,不过从你的代码来看这是浪费
rosanshao:
你也可以在服务器上启用DTC 很显然问题没有出在这儿,我的代码出是在 conn1.Open();这儿出错的。如果真正理解业务逻辑与数据访问的话,不会说我的代码是浪费,这是性能与可维护性的选择。上面的代码只是测试代码而已。
rosanshao:
donghaima:
用一个Conn会出错吗!
rosanshao:
用一个Conn不会错,但是我想要使用两个Conn
有两方面问题要考虑,第一是MSDTC的配置问题,网上有很多文章介绍了这个问题,大概描述如下:
控制面板/管理工具/组件服务/计算机/我的电脑/右键属性/MSDTC/安全性配置,在这个对话框里把你觉得需要的都勾起来。
第二个问题很容易被忽视,就是防火墙设置,如果你用的是Windows自带的防火墙,把%systemroot%\system32\msdtc.exe加入例外就可以了。关于MSDTC和防火墙的问题,请参阅下面的文章:
/default.aspx/kb/306843/en-us
rosanshao:
MSDTC的配置问题:已经搜索了很多文章,配置基本上都试过,仍然不成功。
防火墙设置:这个问题我注意了的,我关闭了防火墙的,我还禁用过防火墙来调试,问题仍然没有解决。
问题最可能是出在MSDTC的配置问题,但是那个的那几个选择,基本是都试过。郁闷啊!
vainnetwork:
shalen520:
sql 2005支持轻量级事物,应该用不到DTC哦
rosanshao:
数据库与应用程序不在同一台机器上,程序中使用了两个Conn,自然升级了分布式事务中了啊
xwk789xwk:
学习之中,帮顶一下
rosanshao:
问题等待解决中。希望大家帮忙解决一下。
rosanshao:
问题等待解决中。希望大家帮忙解决一下。
jiangsheng:
问题是你为什么要用两个连接
连接字符串是一样的啊
rosanshao:
这个不是为什么,这样是为了方便。
jiangsheng:
你可以用一个connection factory,在当前事务打开了连接的时候使用现有连接,否则使用新连接
我给你的链接里面有代码
rosanshao:
你可以用一个connection factory,在当前事务打开了连接的时候使用现有连接,否则使用新连接
我给你的链接里面有代码
我看了那个代码,实际上他的哪个仍然是一个Connection,只是他做了封装,使用起来更方便。这样问题基本上能够解决,但是我在想,是不是用了两个不同的Connection就不能使用了呢?
cyrix_wxm:
根据错误信息就可以知道是 MSDTC事务没有成功
还争什么 连接字符串的问题。。!!
jiangsheng:
连接数据库两次自动就把你的连接提升到DTC了,不开DTC当然会出错
rosanshao:
根据错误信息就可以知道是 MSDTC事务没有成功
还争什么 连接字符串的问题。。!!
那你说说连接字符串错在哪儿了?
连接数据库两次自动就把你的连接提升到DTC了,不开DTC当然会出错,我的DTC是开起了的。我使用那个Dping工具测试,已经通过了的。
rosanshao:
Dping工具测试,已经通过了的
xiaoliangwh:
rosanshao:
rosanshao:
很顯然,同一個TransactionScope 里面是不能有兩個connection的
rosanshao:
为什么呢?显然你说显然前应该思考一下。
rosanshao:
rosanshao:
lhfzd2004:
JDBC里面,事务管理是只能针对一个Connection的。
MSDTC可以管理多个conn,我看你的代码里似乎没有关闭连接,不知道会不会是这个问题,建议检查一下。
rosanshao:
using (SqlConnection conn = new SqlConnection(connectionString))
这句就是关闭连接。
xiaoliangwh:
rosanshao:
rosanshao:
rosanshao:
希望能人帮助我一下。谢谢
MSDN里的这个例子,能解决你的问题么?关闭Connection1的时机和你不同
/zh-cn/library/system.transactions.transactionscope(VS.80).aspx
DengXingJie:
出現與樓主類似的問題
pt1314917:
我也是做分布式事务时,和楼主出现同样的问题。。
alisande1:
我觉得应该是SQL2005不支持
我也是这个问题
alisande1:
SQL2008,我用Nhibernate没有一点问题
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动随笔 - 513&
评论 - 11929&
&&&&&&&&&&&
1:本地事务DbTransaction和分布式事务TransactionScope的区别:
1.1:mon.DbTransaction:
本地事务:这个没什么好说了,就是单个事务,每种数据库都有自己的实现,事务的深度内涵可以搜索查看相关的文章,不是本文介绍的重点。
1.2:System.Transactions.TransactionScope:
分布式事务,需要添加引用System.Transactions,同时启用MSDTC分布式事务服务:通常使用方式为:
&using&(System.Transactions.TransactionScope&ts&=&new&System.Transactions.TransactionScope())
&&&&&&&&&&&&&&&&//代码块A
&&&&&&&&&&&&&&&&//代码块B
&&&&&&&&&&&&&&&&plete();//提交事务
分布式事务本质上是引入了第三方裁判,来想办法对多个本地事务监控同时成功或同时失败,这里分享几个知识点:
A:如果代码块里,若存在两个或以上数据库链接DbConnection,则需要启动微软的MSDTC分布式事务服务。
用命令行启动或停止服务:
B:如果代码块里,只有一个数据库链接DbConnection,那么实际上只是本地事务在处理,就算MSDTC分布式事务服务没启动,也不会报错。
C:对于TransactionScope包含的代码块,本质是监控了代码块里数据库链接DbConnection的个数,如果有多个不同的对象,则引入MSDTC当裁判,而实际执行的事务的还是各个本地事务。
D:MSDTC总是不够稳定,我在测试时两个简单的事务一起时,按住F5不停刷新,竟然能把MSSQL服务也给挂了,而用本地事务就算跨库也不会有问题。
所以,不是必须的情况,尽量不要引入分布式事务,应该避免使用TransactionScope来包含事务块的冲动。&
2:可以用本地事务解决,避免使用分布式事务场景:
2.1:项目只有一个数据库,这个是最应该避免,多个表间的事务, 完全是本地事务可处理的范围:
问题:一个代码块里N个实体类杂交操作,每个实体类带有各种的数据库链接,从而引发了MSDTC。
可以:共用一个DbConnection对象,来避免启用MSDTC。
2.2:项目多个数据库,如果数据库间使用了相同的访问账号和密码,这种情况也可以避免:
每种数据库有自己的解决方式:像MSSQL,跨库处理只要加前缀(dbname..tablename)就可以,因此也使的只使用本地事务就可以处理了。
3:回顾下我以前的项目场景:
3.1:从下图是我08年在中域的项目:有19个数据库,对于数据库链接而言,唯一的不同只有数据库的名称:
进化:能不能只保留一条,其它的通过动态切换数据库名称来改链接字符串?
3.2:那时候,我的架构还是很新手,通过CodeSmith生成了大量的代码文件:
实体类项目,工厂项目,接口项目,数据操作,还有大量的增删改查存储过程,只是为了基础的增删改查而且只针对MSSQL。
随便展开一个项目都会看到大量的文件夹,里面有大量的文件,而这些东东,都是代码生成器的杰作:
19个数据库啊,NN个表,光生成这些基本的增删改查,整个项目就好像高端大气上档次了。
进化:能不能消灭这些大量的文件,简单是我们不断追求的目标。
3.3:这么多数据库,如何跨数据库事务?
对于生成的大量的实体,每个表的操作都是一个新的链接,单库间的事务都必须MSDTC了,更别说19个库间的跨库事务了。
进化:能不能本地事务搞定这些,这是每个ORM可以思考的方向。
4:CYQ.Data 提供的解决方案:&
为了消灭上述的那些大量的生成文件,我在后续新的公司写了传统的ORM框架:XQData(这个框架一直没露过面,也只是支持MSSQL,用反射消灭了好多层,只留下实体层)。
对于框架的演进,多数都来源于项目中遇到的问题,或复杂的场景,需要解决或者简化,才有了不断升级的可能,并不是无中生有,因此,一个框架,如果不能不断在在项目中实战,那么很多问题和细节等可能都无法发现,更新也会遥遥无期。&
而CYQ.Data的不断升级,说明我一直在奋战在一线的编码生涯中和网友各大项目中的实战反馈中。&
下面针对最近的优化调整,演示下CYQ.Data是怎么解决上面提到的几个问题:
4.1:多个数据库的数据库链接切换:
A:先用配置工具生成针对多数据库的枚举文件,和成demo和test两个数据库:
两个数据库就生成两次了。
B:配置一个默认的链接字符串,到Demo数据库:
&add&name="Conn"&connectionString="server=.;database=uid=pwd=123456"/&
C:打印操作Test数据库表的链接字符串:
using&(MAction&action&=&new&MAction(TestEnum.Users))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&Console.WriteLine(action.ConnectionString);
&&&&&&&&&&&&}
这里自动切换了数据为名称为新的链接,而我动手脚的地方就是在枚举的名称了。
4.2:本地多数据库跨事务,示例:
& & & & & & AppDebug.OpenDebugInfo&=&true;
&&&&&&&&&&&&AppDebug.Start();
&&&&&&&&&&&&using&(MAction&action&=&new&MAction(DemoEnum.Users))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&action.BeginTransation();//开启事务
& & & & & & & & &action.Fill(12);
&&&&&&&&&&&&&&&&Console.WriteLine(action.ConnectionString);//打印数据库链接
&&&&&&&&&&&&&&&&action.ResetTable(TestEnum.Users);//切换数据库
&&&&&&&&&&&&&&&&Console.WriteLine(action.ConnectionString);//打印数据库链接
& & & & & & & & action.Fill(12);
&&&&&&&&&&&&&&&&action.EndTransation();
&&&&&&&&&&&&}
&&&&&&&&&&&&Console.);//输出所有执行的SQL语句。
&&&&&&&&&&&&AppDebug.Stop();
输出的结果:
说明:在事务中,当检测到事务开启时,为了使用本地事务,并没有切换数据库,而是采用了前缀来执行操作。
如果注释掉代码中的事务,则是直接切换数据库链接,输出会如下图:
说明:如果没有开启事务,则直接切换了数据库链接,并消消灭前缀语法。
对于.NET领域,微软除了提供这个不太稳定的MSDTC,似乎没有发现其它分布式事务的解决方案,好在一般的项目,我们在本地事务就可以处理。
希望微软可以在一些重点分布式上多做点研究、普及和推广,提供分布式相关项目的解决方案,别整天操碎心在那些简单的增删改查上。
新的一年,要重新卖身了,打算漂泊,城市不限,欢迎大伙推荐买主,谢谢。
阅读(...) 评论()本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 transaction scope 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信