前传:
上周工作时,犯了件蠢事,select数据的时候加入了for update却忘记了加条件,测试环境的数据过多,查询时间太长,于是就把这个进程给kill了,结果造成了锁表。
结论:
for update语句一旦运行就会把表锁住,防止他人和你一同更改,第二个连接进来再进行select 。。。for update会造成阻塞,即第二个连接无法查询出数据。
在前传中,我将进程kill了,但是没有提交该事物,所以oracle认为,这个连接一直在修改数据,于是没有办法再执行for update语句。
但是for update锁住的只有符合条件的行,不符合该条件的行还是可以继续修改,比如:insert。
周末在家想重现这个事件,又不可能造大量的数据来造成当时查询时间过长的状况,于是,我想不commit直接关闭PL/SQL,但是无论如何都重现不了工作中的状况。
后来发现,PL/SQL有设定,当我们注销或者关闭PL/SQL的时候,默认提交事物,选项中只有“提交”、“回滚”和“询问”三个选项,所以当我们直接关闭PL/SQL的时候是很安全的。