[该贴被litdong于2007年02月06日 15:48修改过]
[该贴被litdong于2007年02月06日 15:50修改过]
其实想想,一个线程在做INSERT时,肯定是锁表的,那另一个线程跑到对同一个表UPDATE时肯定得不到控制权,但是不希望UPDATE总等着INSERT做完毕才开始执行,希望INSERT 和UPDATE能像时间片轮转一样不要总等着对方。
to litdong
不太明白你的意思,“在什么环境下写的库”?我们是用C#写的方法,分别对同一表进行INSERT 和 UPDATE,而这两个方法可能由不同线程调用
to wellsl
我想数据库应该只有ORACLE和SQL SERVER 等等不同工具的区别吧,我们用的是ORALCE
不会出现你说的情况
除非同时update同一条记录
同时的update由数据库负责,简单的update是不会死锁的
trans1
start tx
update table1
insert table2
commit tx
trans2
start tx
delete table1
update table2
commit tx
注意这样才是正确的,不要一会在这个事务中的访问须序是table1然后table2,而在另一个事务中则先是table2然后再table1,这样特别易出现死锁.
trans1:
insert table1
trans2:
update table1
问题是对同一表的操作,trans1的INSERT操作可能还没做完, trans2就已经被调用
如果是同一数据,线程二需要重新写先select测试,然后再update
否则粒度太大很容易出现lockwaitTimeOut
特别是比较大的系统,比如证券交易、银行系统
使用乐观锁很容易死锁或者出现长等待的问题
而且效率很低,如果只是小系统可以先让线程二sleep,然后notify()就可以了