在项目中,发现在同事编写存储过程导致分布式锁超时的报错,报错的内容:
ORA-02049: timeout: distributed transaction waiting for lock.
原因是在调整存储过程的时候,由于少复制了最后的commit语句,导致了同时对同一张表操作的另一个语句(通过db-link连接过来的)需要等待该表上的锁释放。
对于分布式锁的超时的定义,官方有以下描述:
DISTRIBUTED_LOCK_TIMEOUT:specifies the amount of time (in seconds) for distributed transactions to wait for locked resources.
该参数等于分布式锁超时的时间,超过这个时间事务一般会自动回滚。该值如果为60,则代表默认等待时间是60秒,超过60秒之后会回滚事务。
从本次操作过程来看,表面上是commit漏写导致了问题,实际上引申出了事务对于表对象的影响和规范行问题,总结如下:
1、建议在编写存储过程的时候,尽量使用短事务。
2、代码审核要认真仔细。
3、如果有条件,可以使用审核平台等工具,用软件进行审核有助于保证SQL语句审核质量的稳定性。
阅读(3074) | 评论(0) | 转发(0) |