最近在开发一个网络程序,突然想到一种极端情况:
比如客户端给服务端发送一个commit 命令,
我主观猜测流程应该是:
客户端调用write往套接字写commit命令,oracle服务端收到commit命令后执行提交,同时反馈给客户端commit的结果,此时假如网络突然中断了。客户端收不到服务器发送的反馈消息,而服务段又提交了事务。这样可能会造成客户端再次执行一个之前的命令,有可能造成数据重复提交了。有没有哪位高人了解oracle事务的处理机制的,麻烦给解惑一下,谢谢。
比如客户端给服务端发送一个commit 命令,
我主观猜测流程应该是:
客户端调用write往套接字写commit命令,oracle服务端收到commit命令后执行提交,同时反馈给客户端commit的结果,此时假如网络突然中断了。客户端收不到服务器发送的反馈消息,而服务段又提交了事务。这样可能会造成客户端再次执行一个之前的命令,有可能造成数据重复提交了。有没有哪位高人了解oracle事务的处理机制的,麻烦给解惑一下,谢谢。
如果一个事务已经提交,再次执行commit也没有关系啊。
比如:
update t set t.a = t.a+2;
commit;执行commit之后网络闪断,客户端认为没有更新成功,再次执行一下上面的语句,会造成重复更新。
就是说,应用没有接收到成功提示,就会直接再运行一次你的这段脚本?
LZ制订的应用程序是这个规则吗?
从服务器上来说,commit就commit了,否则就会rollback。
导致之前的事务中所有dml操作回滚。