同一个应用程序中使用两个不同线程访问同一个数据库(50分)

  • 主题发起人 主题发起人 滑翔机
  • 开始时间 开始时间

滑翔机

Unregistered / Unconfirmed
GUEST, unregistred user!
当在同一个应用程序中使用两个不同线程来对同一个数据库中的同一个表进行操作时,
会出现下面的问题,如:线程A将表中的一条记录删除了,并且使用TDataBase进行了事务
提交,但是线程B仍然会发现该记录。这是为什么?
 
如果线程A已经进行了commit,线程B在进行select的化,应该是线程A处理后的结果了
是不是线程A与线程B的执行次序有问题?
 
不同线程对同一个database操作,最好是建立线程自己的database session,
加上TSession组件,否则都会有想象不到的结果出现。
同理,可以用Tthread.Synchronize的方法序列化对数据库的操作,当然,这样就体现
不出多线程的优势了。
欢迎交流。
 
我对不同的线程使用了不同的session
 
我感觉多线程对数据库的操作不好把握,经常会有不可预料的问题,烦死
//可能是我水平臭吧,听听各位老大的意见吧
 
为了共享资源线程同步是必须的!你可以用临界区或互斥对象。
 
使用Tthread.Synchronize进行吗?
Tthread.Synchronize好像是用于可视控件的同步的。
 
通常來說, 為了增加處理的效率, TTable、TQuery等會對所暫存所讀取資料, 所以如果
在兩個線程中同時開啟資料集, 而一個線程中刪除其中一筆資料, 在另一個線程中還會
出現這筆資料;
新增也是一樣, 一個線程如果新增資料;
在另一個線程中已開啟的資料集
中, 往往也會找不到這筆;
建議你在製做線程同步的機制;
當在一線程中更改了某個資料
其他線程會跟著刷新已經開啟的資料集;
不過這一樣會有問題是, 如果數據庫本身就有延遟刷新的問題(Data file的數據庫如Access
很容易會有這種情況), 有可能重新開敫數據集還是取到舊的資料!
 
接受答案了.
 
后退
顶部