处理数据时如果网络连接突然中断,程序 ……

aop12a 2011-08-04 09:02:36
有个客户那边的网络经常会网络中断一会,网络不是很稳定。给客户那边做了一个销售系统,单据有主单和明细单,在审核单据的时候会去更新库存数等等相关的操作。这些我用存储过程,用事务处理。

现在有个问题:
1、程序按钮事件调用SQL存储过程,存储过程有事务处理机制。当在前台执行按钮事件后,突然网络中断了,那SQL 服务器的事务还会继续处理吗?
2、如果在程序前台中直接使用事务,突然网络中断了,已经执行的SQL语句如何回滚?
请指点!
...全文
596 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
楼上的,没几个明白楼主的意思,真的很无语
楼主,oracle的话一般会自动回滚,具体什么时候回滚,根据它内部的实现
aop12a 2011-08-04
  • 打赏
  • 举报
回复
select * from test1 会出现无限等待中
aop12a 2011-08-04
  • 打赏
  • 举报
回复
做了个测试:
private void button1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(conString);
con.Open();
SqlTransaction sqltran;
//将事务绑定到连接对像
sqltran = con.BeginTransaction();
try
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "insert into test2(id,pname) values('1','mmmm')";
cmd.Transaction = sqltran;
cmd.ExecuteNonQuery();

MessageBox.Show("contin","dddd",MessageBoxButtons.OK);
//在这里拔开网线 测试

SqlCommand cmd1 = new SqlCommand();
cmd1.Connection = con;
cmd1.CommandText = "insert into test1(id,pname) values('1','mmmm')";
cmd1.Transaction = sqltran;
cmd1.ExecuteNonQuery();
MessageBox.Show("is ok", "dddd", MessageBoxButtons.OK);
sqltran.Commit();
}

catch (System.Data.SqlClient.SqlException sqlex)
{
sqltran.Rollback();
MessageBox.Show(sqlex.Message);
}
catch (Exception ex)
{
sqltran.Rollback();
MessageBox.Show(ex.Message);
}
finally
{
}
}

结果数据库的表test1出现故障,没法打开了
猿粪来了 2011-08-04
  • 打赏
  • 举报
回复
这个和断网没有关系,只是断网后执行的结果客户看不到

这个不影响程序的执行
呆子罗 2011-08-04
  • 打赏
  • 举报
回复
其实就是2种情况:执行SQL语句和不执行SQL语句。只是断网了客户看不到结果而已!
子夜__ 2011-08-04
  • 打赏
  • 举报
回复
数据库有这个机制。。
afu45 2011-08-04
  • 打赏
  • 举报
回复
只要服务器接收到命令就开始工作了,前台来不来“视察”结果,对服务器刚完成的工作没任何影响。
highpr 2011-08-04
  • 打赏
  • 举报
回复
这个问题应该是存在的,必须解决掉
CalvinR 2011-08-04
  • 打赏
  • 举报
回复
我是路过的
weipt 2011-08-04
  • 打赏
  • 举报
回复
建议认真看一下事务机制,回滚由谁完成
ycproc 2011-08-04
  • 打赏
  • 举报
回复
如果送你知道事务的原理 就不会问这个问题?

既然不知道原理 为什么你又做了这个事务?


费解 反思
laolaolai 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sp1234 的回复:]
引用 6 楼 laolaolai 的回复:
2、如果在程序前台中直接使用事务,突然网络中断了,已经执行的SQL语句如何回滚?
都跟数据库失去联系了,还怎么回滚啊?


可能在你的观念中,c-s数据库系统就是个jet引擎那种文件数据库吧。
[/Quote]
我说没法回滚,并不是说以前的数据就写进去了。
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 laolaolai 的回复:]
2、如果在程序前台中直接使用事务,突然网络中断了,已经执行的SQL语句如何回滚?
都跟数据库失去联系了,还怎么回滚啊?
[/Quote]

可能在你的观念中,c-s数据库系统就是个jet引擎那种文件数据库吧。
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 aop12a 的回复:]
结果数据库的表test1出现故障,没法打开了结果数据库的表test1出现故障,没法打开了[/Quote]

你很能“整事”啊!

贴出你的conString值我们看看,你搞的什么所谓的“数据库”?
laolaolai 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 aop12a 的回复:]
在WinForm 中
不能在前台使用事务处理,调用SQL存储过程这个方法才是正确的。


因为,如果在前台插入一条数据到主表后,网络又断了,那么主表会生成一条记录,明细表由于网断线了,没有生成一条记录。这样的话主表会有一条多余数据啊!
[/Quote]

在你没向数据库提交前,表中是不会有任何你写入的数据的,所以不会产生垃圾数据。
只有数据库收到commit命令后,才会真正写入。
Ny-6000 2011-08-04
  • 打赏
  • 举报
回复
正常处理,只是用户收不到反馈了.
aop12a 2011-08-04
  • 打赏
  • 举报
回复
在WinForm 中
不能在前台使用事务处理,调用SQL存储过程这个方法才是正确的。


因为,如果在前台插入一条数据到主表后,网络又断了,那么主表会生成一条记录,明细表由于网断线了,没有生成一条记录。这样的话主表会有一条多余数据啊!
MSDNXGH 2011-08-04
  • 打赏
  • 举报
回复
如果是web模式,只实际只有在请求,和响应才会用到网络。当接到请求时就会执行程序。也是就是执行程序只,己经不需要网络了。

如果突然中断就是,服务端续继执行它的程序,但不再输出到客户端。

执行完了,就等待下一次响应。
laolaolai 2011-08-04
  • 打赏
  • 举报
回复
2、如果在程序前台中直接使用事务,突然网络中断了,已经执行的SQL语句如何回滚?
都跟数据库失去联系了,还怎么回滚啊?
laolaolai 2011-08-04
  • 打赏
  • 举报
回复
如果你点按钮执行后,程序其实是把SQL命令串发给数据库,这个时间很短(毫秒级别),
只要数据库收到执行命令,自然会继续执行,跟你前台运行正常不正常没关系了。
如果是发送SQL命令前就断了,那肯定不执行。
加载更多回复(2)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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