Oracle不同步及死鎖問題(120分)

  • 主题发起人 主题发起人 databox1
  • 开始时间 开始时间
D

databox1

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大俠﹕
我剛寫出來的程序中﹐我發現一個問題。即﹕我在一台客戶端上(A機)刪除了一筆資料
之后﹐在A機上用查看該筆資料已被刪除﹐退出該程序﹐在到另一台客戶端(B機)上去查詢時
﹐這筆資料居然還在﹐這是怎么回事﹖而等了一陣子之后(几分鐘后)﹐我再在B機上查詢﹐
又沒了﹐即被刪掉了。(反正我覺得奇怪﹐就將程序開了又關閉﹐關閉了又開﹐几次)。我數
據庫是Oracle 8.1.6﹐Delphi 5.0企業版。程序中我是用的Query﹐更新都沒問題。大俠們
遇到過這個問題嗎﹖該怎么解決﹖-->60分
另外﹐數據庫好像也老是有死鎖的問題﹐比如說修改該筆資料﹐程序就死在那儿了﹐關
掉程序后﹐用SQL * PLUS查看數據也已改掉了﹐但要是用SQL * PLUS更改﹐SQL * PLUS也會
死掉。該怎么辦﹖即遇到死鎖怎樣解決以及程序中應該怎樣避免﹖-->60分
 
你在执行完,修改操作后TDataBase.Commit;提交操作
应该可以避免你说的情况
Oracle支持记录级的锁
对于同一条记录一个用户,获得了一个写锁后其他的用户
不能获得写锁或读锁。如果用户这时申请读锁或写锁,就的等待
记录的写锁被释放以后。(客户端看来,是死锁)
但一条记录,可同时获得几个读锁。
 
你说的第一个问题十有九九是没有COMMIT, 不过DELPHI的那几个补丁特别是针对ORACLE的,
还是要打一把.
第二个问题, 用PLSQL DEVELOPER仔细看看这张表的结构,看看它到底跟别的表有什么不同.

 
謝謝兩位的解答﹕
第一個問題﹕為什么我等了一會儿之后﹐數據庫又改掉了呢﹖中間我也沒有做其他操作
呀。而且A客戶機的程序我已經關閉掉了。那么無論是提交成功還是不成功﹐都應該對數據
庫作了相應的Commit或Rollback操作﹐即數據庫都應該已經做過改動了呀。我再說明一下﹕
我在A機上做刪除操作﹐然后關閉A機上的程序﹐到B機上再看﹐數據還在﹐等一陣子后﹐數
據不見了(已被刪除)。這個問題看起來應該是沒有Commit的問題﹐但我將程序已經關閉了﹐
而DataBase在程序退出時﹐難道沒有自動Commit或Rollback嗎﹖另外﹐說明一點﹐我是將用
戶及密碼加在程序里面的﹐所以﹐客戶端的用戶和密碼在Oracle里面都是用的同一個用戶名。
第二個問題﹕因為數據庫出現死鎖﹐但我是用的同一個用戶上去﹐不存在別的用戶的問題﹐
那么﹐相同用戶怎么才能自己解除掉死鎖問題呢﹖
謝謝解答﹗最終接受答案者得全分﹗﹗
 
1. 刷新并非是自动的
2. it 's maybe impossible
 
对于第二个问题通常是这种情况下产生的循环死锁:
A申请B的资源,而B又申请A的资源,比如一个程序要修改两个表为一个事务,当修改完A表后去
修改B表的时候,恰好另一个事务刚修改完B表要修改A表,因为上访都没有释放锁,也都没有
完成事务,因此处于永远的等待中,这是一种典型的死琐,解决的方法是在程序中对表的操作
一定要按照一个顺序,不要交叉,如果程序中要避免死琐的话可以加上NOWAIT子句告诉SQL语
句立即返回,如果此时出现资源征用将返回一个错误!而不是处于等待状态!
对于第一个问题我查查资料!
 
謝謝各位﹕
這几天老上不來。我發覺我的程序中的確需要commit﹐我曾經試過﹐我在程序中修改了
記錄之后﹐的確還沒有commit。同時﹐我用SQL PLUS來修改該筆資料﹐就會出現等待狀況﹐
而我一退出程序﹐SQL PLUS上也馬上過了。而在程序中我是用的Query接合UpdateSQL﹐調用
ApplyUpdates和CommitUpdates;難道這還不行嗎﹖難道我的程序中的每一次提交都要用上
DataBase.Commit嗎﹖這樣會不會影響效率﹖
  死鎖我會想法子盡量避免。但一旦發生死鎖﹐我們不管程序怎么寫的﹐Oracle自己有沒
有什么方法解決死鎖呢﹖比如一個命令或一個SQL語句﹖
 
難道我的程序中的每一次提交都要用上
DataBase.Commit嗎﹖這樣會不會影響效率﹖
---当然要.
这不是效率不效率的问题,而是你要不要数据入库的问题:)
当然了如果你是一组事务,可能顺序干了很多事情(都是DML性质的事),
DELETE/UPDATE/INSERT...
结束处COMMIT一把就行了(这个不用说是吧)
注意里面如果有一条DDL语句,则在此之前所有DML语局自动COMMIT.
而不等到你显式的COMMIT.
至少ORACLE是这样.

  
 
謝謝各位的解答﹗第一個問題基本上已經解決了﹐但若數據庫已經死鎖﹐我怎么才能解鎖
呢。謝謝﹐第二個問題完了就可以發分啦。
 
到这个地方看一看
http://www.oradb.net
不会白跑的
 
笑傲江湖讲得真细,佩服佩服。
 
若要避免大量死锁的话应该采用CachedUpdate,Delphi中有范例程序,但是代码改动量很大
 
算了﹐結束吧。http://www.oradb.net這個網站我知道﹐但沒有講死鎖。
 
后退
顶部