操作Oracle数据库事务,执行一半,模拟断网,造成表死锁,无法回滚

fdevilzsh 2018-01-11 04:52:03
在程序里执行Oracle事务,想要预防断网问题,但是事务执行到中间的时候,强行断网,会造成此表死锁,就算重连后通过catch捕获异常,也无法使用回滚,如图

private void HG()
{
OracleConnection hgconn = new OracleConnection(oraclstr);
hgconn.Open();
OracleCommand hgcomm = new OracleCommand();
hgcomm.Connection = hgconn;
while (GuanBi)
{
OracleTransaction OT = hgconn.BeginTransaction();//创建事务对象
try
{
hgcomm.CommandText = "insert into ZSH_CS (ID,NAME) values (1,'圣诞节')";
hgcomm.ExecuteNonQuery();
hgcomm.CommandText = "insert into ZSH_CS (ID,NAME) values (2,'万圣节')";//断点到这句,禁用本地连接
hgcomm.ExecuteNonQuery();
hgcomm.CommandText = "insert into ZSH_CS (ID,NAME) values (3,'元旦')";
hgcomm.ExecuteNonQuery();
OT.Commit();
Thread.Sleep(1000);
}
catch
{
hgzs1.Set();//通知另一个线程尝试连接数据库
hgzs.WaitOne();//阻塞本线程
OT.Rollback();//回滚,这里报错
hgconn.Close();
hgconn.Open();
//OT.Rollback();//回滚,写这里也报错
}
}
}

因为,断开后再重连的连接已经不同了
请问有没有什么办法可以处理,或者有没有其它思路?
...全文
1262 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fdevilzsh 2018-01-17
  • 打赏
  • 举报
回复
谢谢,我想想你说的方法
五更琉璃 2018-01-13
  • 打赏
  • 举报
回复
这种情况 确实ADO事物 确实处理不了,存储过程就不会有这问题。
  • 打赏
  • 举报
回复
你这个方法,弄一个循环 while(GuanBi),然后弄一个 Set和 WaitOne,这本身已经说明了很纠结的问题。假设你要在方法 HG 失败时异步子线程去数据库保存其它内容(比如说日志),那么你就正常地在 HG 方法失败之后去才去异步保存数据就行了。为什么在 HG 执行之前先纠结什么多个线程再弄什么 Set、WaitOne同步?更何况你这个触发了 Set 的线程竟让是在 Set 之后不结束反而是把自己阻塞起来?然后又继续 while 循环? 总之是一切毒瘤都聚在一起了,凡是并发多线程做差的、不需要写的代码都堆砌在一起了。根本不需要写这些代码。
  • 打赏
  • 举报
回复
设计程序本身就不应该胡乱写什么 try...catch,当“断网”时,很明显地,程序应该抛出异常并且跳出了这个程序范畴而交给上层捕获异常去了,而你的代码却还在纠结什么“while循环、try...catch、Set和WaitOne阻塞”,这种跳不出来的思路,程序必然要“死”得很惨。你可能理解不了,我就告诉你具体的内容,就是不应该写 try...catch,并且尽可能删除WaitOne(因为这里看不出设计必要性)。
秋的红果实 2018-01-13
  • 打赏
  • 举报
回复
对于十分要紧的场合,需要多台数据库服务器,备用; 有的情况,各台服务器上的数据完全一样,这样有一台因断电、断网、雷击等不可抗拒的灾害下停止工作,是不会影响整体工作的; 还有种是数据不一样的,存在业务差,比如依次提交A,B,C三个事务,服务器2执行B时,服务器1在执行A,存在一个差,这样一旦服务器2强行停止工作,可服务器1还没执行B,数据还是完好的 ----------------------------------\0
fdevilzsh 2018-01-12
  • 打赏
  • 举报
回复
引用 3 楼 a346729576 的回复:
用存储过程
谢谢我试试
夜色镇歌 2018-01-12
  • 打赏
  • 举报
回复
用存储过程
  • 打赏
  • 举报
回复
从你的程序在 Set、WaitOne 这方面,可以看出你比较喜欢自我纠结自我阻塞的代码设计。这样的阻塞问题还会不少。
  • 打赏
  • 举报
回复
要使用结构化的 using 结构,例如
using(var hgconn=.......)
using(var OT = hgconn.BeginTransaction())
{
   ................
}
不要在这里写什么 try...cach。当出现错误的时候,会自动调用hgconn.Dispose() 和 OT.Dispose()。
fdevilzsh 2018-01-11
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
所以要用存储过程 不过若服务器断电,又无UPS,也是麻烦事
原来是这样,谢谢
xuzuning 2018-01-11
  • 打赏
  • 举报
回复
所以要用存储过程 不过若服务器断电,又无UPS,也是麻烦事
课程简介: 课程总计41课时,从什么是事务讲起,直到分布式事务解决方案,很的0基础基础与提升系列课程。对于难以理解的知识点,全部用画图+实战的方式讲解。 第一部分:彻底明白事务的四个特性:原子性、一致性、隔离性、持久性,用场景和事例来讲解。 第二部分:实战讲数据库事务的6中并发异常:回滚丢失、覆盖丢失、脏读、幻读、不可重复读、MVCC精讲。 第三部分:彻底搞清楚4种事务隔离级别:READ_UNCOMMITTED 读未提交隔离级别、READ_COMMITTED 读已提交隔离级别、REPEATABLE_READ 可重复度隔离级别、SERIALIZABLE 序列化隔离级别 第四部分:彻底搞清楚MySQL的各种锁:行锁、锁、共享锁、排它锁、Next-Key锁、间隙锁、X锁、S锁、IS锁、IX锁、死锁、索引与锁、意向锁等。 第五部分:彻底搞清楚Spring事务的7种传播级别的原理和使用:PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER、PROPAGATION_NESTED分布式事务的理论基础:RPC定理、BASE理论、XA协议都是什么,原理是什么,有什么关联关系 第六部分:分布式事务的5种解决方案原理和优缺点:2PC两阶段提交法、3PC三阶段提交法、TCC事务补偿、异步确保策略、最大努力通知策略 第七部分:阿里巴巴分布式事务框架Seata:历经多年双十一,微服务分布式事务框架,用一个Nacos+Spring Cloud+Seta+MySql的微服务项目,实战讲解阿里的分布式事务技术,深入理解和学习Seata的AT模式、TCC模式、SAGA模式。 课程资料: 课程附带配套2个项目源码72页高清PDF课件一份阿里巴巴seata-1.1.0源码一份阿里巴巴seata-server安装包一份

110,525

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧