日期:2014-05-18  浏览次数:20507 次

[讨论100分]存储过程在什么情况下调用不成功?
程序是C/S三层的,所有的业务逻辑判断都在存储过程中(包括数据基本的增,减,删也是)!
保存一个表的数据时,常常调用其它存储过程来更新其它表的相关记录。所以常有锁产生,忙时死锁也存在过。
问题是:时常发生数据未更新的情况,大部分是原因本身的数据表已更新,但调用其它存储过程不成功。
比如:保存表A对应的存储过程是ProA,ProA中调用ProB来Update其它表的相应记录.结果ProA被执行,但ProB没有执行,检查后语法上没有错误。

大家分析一下存储过程在什么情况下调用不成功呢?锁的影响是什么?



------解决方案--------------------
不太清楚。
------解决方案--------------------
最常发生的是数据校验等过不去

------解决方案--------------------
顶上去
------解决方案--------------------
如果没有用事务,这样做是很危险的

死锁和意外出错都会造成数据的部分更改,形成数据不统一

------解决方案--------------------
你可以用事务来回滚。
------解决方案--------------------
使用事务保证数据处理的一致性。

SQL Server的T-SQL支持事务嵌套。

如:


--设置事务处理的一致性开关,如果中途失败,整体回滚。
set xact_abort on


begin tran

...


commit tran

return 0
------解决方案--------------------
一般是数据异常,或者资源锁定的情况下,执行不成功。
------解决方案--------------------
一般修改表什么的,还是用事务吧!
------解决方案--------------------
使用事务保证数据的一致性

SQL有检测死锁功能
一旦发现死锁系统会自动牺牲一个进程来解除死锁
有可能你那个进程被KILL了

------解决方案--------------------
在数据更新中增加事务,保证数据的完整性

在开发工具调用存储过程是,保证能够获取存储过程执行的状况(成功,不成功,或在存储过程中增加错误代码),确保存储过程执行的成功率
------解决方案--------------------
1.比如說插入關鍵字相同的記錄,
2.field(0) : tinyint update field(2)=123434123..
............................

一般是執行到錯的那句吧,可能在proc_A,也可能在proc_B的前幾條語句.....

把數據存起來,手動執行看看..
------解决方案--------------------
使用事务保证数据的一致性,这样比较好