还有一个问题,我们在进行insert update delete时,椐我所查到的资料所说这些操作会自动取得行级锁,我想问清楚一下,如果我同时由两台机子对一个表进行第一台执行:update from table_name set name = 'name*' 与 第二台执行:update from table_name set age = '50' 比如此表记录有一万条(只是为了说明需求一些时间才能在独立执行某个语句时,时间也要很长),那我想问一下,这两条怎么运行?交叉运行还是,先运行某条完成后,再运行另一条.
会产生冲突的只是对共享区域的操作,比如oracle执行sql修改数据
这就需要你写的存储过程要合理,否则就可能发生死锁现象。
假如你的存储过程中有update tableA,update tableB,update tableA的情况,就极有可能在并发是发生死锁。
如果修改一下顺序为update tableA,update tableA,uptdateB就会把发生死锁的情况降低很多很多。
如下内容:
1 0 8
2 1 16
3 2 12
;LOCK TABLE tt IN EXCLUSIVE MODE NOWAIT;
UPDATE tt SET a4=2 WHERE a4=2;
UPDATE tt SET a4=1 WHERE a4=1;
commit;
上面的方法就不会因为并发而产生死锁,因为tt这个表被整个锁定了,其它session无法修改,
只能等待操作进程完成后,才能再次获得表锁。
网络资料:
所谓的oracle存储过程,无非就是把大量的SQL集中在一起加入了变量循环等。
简单地看它就也就是对几个数据库对象的访问。
我们知道oracle数据库对象的访问是有锁机制的,同一时间内
只有一个用户能访问这样的对象,(最底的行级锁)
可以想象如个2个人同时对一个对象的同一个内容进行处理那
是不可能的。
锁只能被一个用户保持,这是规矩
当然这都是oracle 内部机制,如果多线程调用并非完全相同的内容,锁的竞争不是那么明显当然能够提升处理速度的。