全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:932
推到 Plurk!
推到 Facebook!

关于事务中一个更新的问题

 
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-12-19 20:14:36 IP:222.184.xxx.xxx 訂閱
在事务开始时,我想要查询出一个表里的数据备用,但查询时是S锁,我现在是这样做的,就是在查询前先更新一下,其实这个更新是无意义的,只是为了加U锁而已,不知道这样做是对不对的
datamoduleform.ADOConnection1.BeginTrans;
try
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('update 表一 set 单位=:dw1 where ID=:id and 单位=:dw2');
ADOQuery1.Parameters.ParamByName('dw1').Value:=dw(变量);
ADOQuery1.Parameters.ParamByName('dw2').Value:=dw;(同上)
ADOQuery1.Parameters.ParamByName('id').Value:=ypid;
ADOQuery1.ExecSQL;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from 表一 ...........)
.......................
------
我的编程起步于ktop,我将永远支持ktop
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-12-20 15:18:48 IP:218.163.xxx.xxx 未訂閱
其實Lock是針對不同transaction,才有意義吧

同transaction內的資料本來就是互相且可視的....
------
星期一,二...無窮迴圈@@
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-12-21 19:59:09 IP:222.92.xxx.xxx 訂閱
我是说的就是不同的transaction,但如果事务开始用S锁的话,另一个事务也发出同样的请求时,查询到的数据就不正确了
比如 A用户:查询表一某字段,再将该字段数据加上1,B用户查询表一某字段,再将该字段数据加上1,如果正好同时发生,那么该字段的数据没有加到2?
我现在的方法是 A用户: 修改表一另一个字段(其实就是修改为原来的内容,等于没修改,但就是事务一开始就加了U锁,)查询表一某字段,再将该字段数据加上1,这样B用户就要等这事务完了才好执行相同的流程(也就是等A事务完了才好开始新的事务加U锁,这样数据就会加到2了?)
===================引 用 文 章===================
其實Lock是針對不同transaction,才有意義吧

同transaction內的資料本來就是互相且可視的....

------
我的编程起步于ktop,我将永远支持ktop
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-12-21 22:14:01 IP:218.174.xxx.xxx 未訂閱
1.你是怕b去讀到a正在改的資料嗎?  那b用readcommited 就可

2.不然就是a更新的動作包在transaction內,a不必先作個update來取Xlock.....
------
星期一,二...無窮迴圈@@
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-12-24 12:24:28 IP:222.184.xxx.xxx 訂閱
我再换一种问法,在事务中比如A用户查询数据,然后修改加1 B用户查询数据,然后修改加1  这样结果会不会数据只加到了1而没加到2的? 
------
我的编程起步于ktop,我将永远支持ktop
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-12-24 16:24:57 IP:222.184.xxx.xxx 訂閱
在网上看到一篇相关的文章后,我想我上面的代码这样改了:(不知道我的提问的意思是否表达清楚了,我这样做是否正确?)谢谢
datamoduleform.ADOConnection1.BeginTrans;
try
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('update 表一 set 单位=''123'' where 1=2 );//永远不可能执行到,但在事务中取得了U锁,其它事务要等这个事务结束后才好执行.保证了下面的代码取出数据后再修改就能正确了.
ADOQuery1.ExecSQL;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from 表一 ...........)
------
我的编程起步于ktop,我将永远支持ktop
系統時間:2024-05-19 19:56:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!