sqlserver 提交事务后经常没有完全更新

cqzjb 2017-09-13 05:02:10
麻烦各位大大了,我用delphi,然后
adoconnection1.BeginTrans;
adoconnection1.Execute(sql1);
adoconnection1.Execute(sql2);
adoconnection1.Execute(sql3);
adoconnection1.Execute(sql4);
adoconnection1.Execute(sql5);
adoconnection1.CommitTrans;

执行之后,程序无异常,没有回滚,但是很多次操作之后,就会发现例如其中某一个sql3并没有执行成功,该修改的数据没有修改,而且这个时候程序也没有抛出异常,所以也就没有回滚

想问问是什么原因,怎么解决。谢谢
希望能够得到解决,再次感谢,如果分不够,可以开贴再给。
...全文
1269 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
whb00120012 2017-12-11
  • 打赏
  • 举报
回复
数据库如果提交多条语句,放在一个事物中,对于ORACLE当前用户当前会话这几条语句的修改,如果信息相关,则语句间的修改互相影响。 对于其他用户或其会话,则读取回滚段中的老值。对于SQL SERVER 则不提交就读回滚段中的老值。
doloopcn 2017-12-08
  • 打赏
  • 举报
回复
引用 6 楼 cqzjb 的回复:
[quote=引用 5 楼 doloopcn 的回复:] SQL语句之间如果是有依赖性质的,应该在SQL中先锁定表,再执行。你反映的情况应该是由共享冲突引起的, 例如说你更新了表1,接着依据表1更新表2,那么更新表2的时候,系统是不会报错的,不过依据仍然是未更新的表1,而不是更新后的表1 也就是说,你执行以上SQL的时候,应该独占表模式进行更新。
@doloopcn 2个表没有依赖关系的。 例如同时修改表1和表2中id=5的memo1字段为‘AAA’ 有时候就出现,表1的memo1已经修改为‘AAA’,表2个memo1还是‘BBB’[/quote] 程序没有问题,那就在SQL数据库系统中找问题,查看SQL事务日志,看一下能不能找到源头
日月路明 2017-12-08
  • 打赏
  • 举报
回复
不是因为你发个adoconnection1.CommitTrans;,就一定能成功的
顽皮小子 2017-12-08
  • 打赏
  • 举报
回复
你好,问题解决了吗?我也遇到了,我向子表插入数据,明明已经成功了,而且子表数据已经被使用了,但不知道啥原因子表数据就没有了,这种情况只是偶尔出现,有人说是冲突引起的,实在是找不到原因了
秋天之落叶 2017-09-13
  • 打赏
  • 举报
回复
虽然不知道你是什么原因,但我有这样的情况,看看有没有参考意义。 1、update语句写的有问题,就不会执行,比如调用其字段进行计算或修改时,容易出问题。 2、update语句N个相同字段用同一个赋值语句赋值。 3、语句中缺少空格时,该语句不提示错误,而是不执行。 以上的问题我都遇到过。 建议你把所有的delphi的sql语句拷贝到sql环境下执行一次,就知道那个语句有问题了。
cqzjb 2017-09-13
  • 打赏
  • 举报
回复
引用 5 楼 doloopcn 的回复:
SQL语句之间如果是有依赖性质的,应该在SQL中先锁定表,再执行。你反映的情况应该是由共享冲突引起的, 例如说你更新了表1,接着依据表1更新表2,那么更新表2的时候,系统是不会报错的,不过依据仍然是未更新的表1,而不是更新后的表1 也就是说,你执行以上SQL的时候,应该独占表模式进行更新。
@doloopcn 2个表没有依赖关系的。 例如同时修改表1和表2中id=5的memo1字段为‘AAA’ 有时候就出现,表1的memo1已经修改为‘AAA’,表2个memo1还是‘BBB’
doloopcn 2017-09-13
  • 打赏
  • 举报
回复
SQL语句之间如果是有依赖性质的,应该在SQL中先锁定表,再执行。你反映的情况应该是由共享冲突引起的, 例如说你更新了表1,接着依据表1更新表2,那么更新表2的时候,系统是不会报错的,不过依据仍然是未更新的表1,而不是更新后的表1 也就是说,你执行以上SQL的时候,应该独占表模式进行更新。
cqzjb 2017-09-13
  • 打赏
  • 举报
回复
完整的是 try adoconnection1.BeginTrans; adoconnection1.Execute(sql1); adoconnection1.Execute(sql2); adoconnection1.Execute(sql3); adoconnection1.Execute(sql4); adoconnection1.Execute(sql5); adoconnection1.CommitTrans; except adoconnection1.RollbackTrans; exit; end;
cqzjb 2017-09-13
  • 打赏
  • 举报
回复
引用 1 楼 lyhoo163 的回复:
事务处理,需要全部语句都能执行。才执行。否则退回了。一句也不执行。
@lyhoo163 比如表1,表2同时需要修改id=1的一条记录的同一个memo1字段,以达到同步的效果 但是有时候就发生了,表1的memo1已经修改,表2的memo1没有修改。真的没搞懂。
cqzjb 2017-09-13
  • 打赏
  • 举报
回复
@lyhoo163 这个我知道,本来我也是一直这样以为的,但是实际效果不是这样的 比如说以上的代码执行了100次,可能中间就有一次的sql3没有执行成功(因为想要修改的数据没有更新成功),但是其他的sql1之类的都是执行成功了的,就是没有搞懂这个原因。 我看了一下sqlserver的事务级别,也没太了解。
lyhoo163 2017-09-13
  • 打赏
  • 举报
回复
事务处理,需要全部语句都能执行。才执行。否则退回了。一句也不执行。

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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