同时操作数据库表的问题。永远在线,必定结贴!

时间:2021-06-07 19:54:59
其实这个问题一早就想问了,只是想考虑清楚再问。我的数据库是本地的Access,我有一个Form2,里面放了一些DBEdit之类的Data Controls控件。Show那个Form2的时候,我就让相连的ADODataSet1处于Edit状态,以便用户修改DBEdit控件的内容。关闭的时候就Post()。中间可能会停留一段时间再关闭。问题如下:
(1)如果在关闭之前,一个Timer控件或者另一个线程要对此数据表操作(插入、删除或编辑等),会出现什么情况?会否冲突?Timer跟线程的情况会否不同?本来可以设置LockType,用乐观锁定或者悲观锁定可以约束编辑,但不知道能否约束插入?
(2)我曾经试过用另外一个ADODataSet2和ADOConnection2连接那个表,即两个ADODataSet同时连接那个表,好像没有出现冲突问题,有没有人能解释?不同的ADOConnection是否用不同的线程?有或者不需要ADOConnection2,只要把ADODataSet1和ADODataSet2都连到ADOConnection1就可以呢?
不知道我说得清不清楚,大家回答之前,最好有试过的经验,不要凭空想象啊!

19 个解决方案

#1


不是我说得不清楚吧?高手都睡午觉去了吗?那我也休息一下。各位朋友,请关注!

#2


如果同时对同一个字段进行写操作的话,肯定有冲突。
所以你要保证在EDIT后马上POST。或者在写之前即时取值
进行比较,相同才写。

#3


LockType有几种方式,其中乐观锁定是假定不会同时对同一纪录作写操作,在写操作的时候才加锁。悲观锁定是在Edit()的时候加锁,Post()的时候解锁。但不知道对Append()有没有约束,具体怎样约束?我在第二个问题中说了,好像那样做就没有冲突。大家有没有试过?

#4


那么多带星的朋友怎么不发表一下意见啊?是不是分不够,可以加。

#5


ADO.NET这套东西是肯定支持线程,而且在win2000以上的系统上运行程序可以使用隔离存储技术来实现你的需求

#6


用ACCESS数据库无法用ADO多线程模式操作,可以在多线程中操作新建连接或用已存在的连接操作它,但这样其实没有达到多线程操作的功能,因为adoConnection是单线程模式,在Timer或Thrend里操作表时如果数据量大的话前端是会停止响应的。
同时操作表是可以的,但只要记住它提出的借误信息并遵循它以它为原则(插入记录不会有错的,因为另一对象的数据集没有更新过,它也不知道另一个对象已添加了一条记录,只能等它刷新数据后才会出现下面的错)
"无法为更新行集定位:一些值可能已在最后读取后改变",就是说,两个对象同时操作一张表,只要任何一个对象将它数据集中的记录改过并Post上去了,另一个对象在没有刷新的情况下去操作这张表中已被另一个对象修改过的任何记录(没有刷新该对象的数据集没有反应出来),都会产生如上所说的错。如果有多个对象同时操作同一张表就应该要避免发生上面的错(我相信你能控制这个错误的吧)

#7


不好意思,我打字经常会出现错别字的.

#8


(插入记录不会有错的,因为另一对象的数据集没有更新过,它也不知道另一个对象已添加了一条记录,只能等它刷新数据后再进行操作不满足以下所说的条件才会出现下面的错)


少了几个字,不好意思,可能会让你理解错误的...

#9


刚才试过,不用ADOConnection2也可以。直接把ADODataSet1和ADODataSet2连到ADOConnection1就可以了。我想,一个ADOConnection可以同时处理多个ADODataSet,但不知道是不是用隔离存储技术来实现的。问题一所说的,一定会冲突的,得谁能解释一下问题二的为何不冲突?

#10


各位朋友,赏赏面子啊!我每天都回答30个左右的问题啊!

#11


up!gz!

#12


我决定在这里放多一天,明天晚上结贴。在这里好像不会有什么答案了,难道要去Delphi论坛里问?

#13


老大,看不明白,你是多用户环境还是?
我怎么觉的好象是你自己搞出来的事情呀

#14


我都说只是本地数据库,我这样做,一定有原因的。我要每分钟操作一次那个表,然后有不定期加入数据。我担心会有冲突,所以想找个简单的方法解决。

#15


今晚结贴,UP者有分。怎么我说的比回答问题的还多?!

#16


我也叫wyb(wangyuanbo),是否同名

#17


access数据库无法测定到底是否琐定因为没有事物处理,在事务处理情况下的处理应该是 jxlee365(老牛自知黄昏晚,不待扬鞭自奋蹄) 的处理方式

#18


简单的方法解决,用DataModule,所有对数据库的操作放在一个线程内,懒得考虑冲突了,反正你又不是很多用户的S-C模式

#19


To tiger111222(vo) :
    “对数据库的操作放在一个线程内”是什么意思啊?每分钟操作一次表的动作可以放在一个线程之内,但不定期增加一条记录的动作不好放啊,我也不知道人家什么时候会加记录。
To runnerrunning(我跑步):
    我们不会同名的,三个声母相同的人很多啊!谢谢你,你还是帮我想一下第二个问题为什么不会冲突啦(我试过,好像不会)?

#1


不是我说得不清楚吧?高手都睡午觉去了吗?那我也休息一下。各位朋友,请关注!

#2


如果同时对同一个字段进行写操作的话,肯定有冲突。
所以你要保证在EDIT后马上POST。或者在写之前即时取值
进行比较,相同才写。

#3


LockType有几种方式,其中乐观锁定是假定不会同时对同一纪录作写操作,在写操作的时候才加锁。悲观锁定是在Edit()的时候加锁,Post()的时候解锁。但不知道对Append()有没有约束,具体怎样约束?我在第二个问题中说了,好像那样做就没有冲突。大家有没有试过?

#4


那么多带星的朋友怎么不发表一下意见啊?是不是分不够,可以加。

#5


ADO.NET这套东西是肯定支持线程,而且在win2000以上的系统上运行程序可以使用隔离存储技术来实现你的需求

#6


用ACCESS数据库无法用ADO多线程模式操作,可以在多线程中操作新建连接或用已存在的连接操作它,但这样其实没有达到多线程操作的功能,因为adoConnection是单线程模式,在Timer或Thrend里操作表时如果数据量大的话前端是会停止响应的。
同时操作表是可以的,但只要记住它提出的借误信息并遵循它以它为原则(插入记录不会有错的,因为另一对象的数据集没有更新过,它也不知道另一个对象已添加了一条记录,只能等它刷新数据后才会出现下面的错)
"无法为更新行集定位:一些值可能已在最后读取后改变",就是说,两个对象同时操作一张表,只要任何一个对象将它数据集中的记录改过并Post上去了,另一个对象在没有刷新的情况下去操作这张表中已被另一个对象修改过的任何记录(没有刷新该对象的数据集没有反应出来),都会产生如上所说的错。如果有多个对象同时操作同一张表就应该要避免发生上面的错(我相信你能控制这个错误的吧)

#7


不好意思,我打字经常会出现错别字的.

#8


(插入记录不会有错的,因为另一对象的数据集没有更新过,它也不知道另一个对象已添加了一条记录,只能等它刷新数据后再进行操作不满足以下所说的条件才会出现下面的错)


少了几个字,不好意思,可能会让你理解错误的...

#9


刚才试过,不用ADOConnection2也可以。直接把ADODataSet1和ADODataSet2连到ADOConnection1就可以了。我想,一个ADOConnection可以同时处理多个ADODataSet,但不知道是不是用隔离存储技术来实现的。问题一所说的,一定会冲突的,得谁能解释一下问题二的为何不冲突?

#10


各位朋友,赏赏面子啊!我每天都回答30个左右的问题啊!

#11


up!gz!

#12


我决定在这里放多一天,明天晚上结贴。在这里好像不会有什么答案了,难道要去Delphi论坛里问?

#13


老大,看不明白,你是多用户环境还是?
我怎么觉的好象是你自己搞出来的事情呀

#14


我都说只是本地数据库,我这样做,一定有原因的。我要每分钟操作一次那个表,然后有不定期加入数据。我担心会有冲突,所以想找个简单的方法解决。

#15


今晚结贴,UP者有分。怎么我说的比回答问题的还多?!

#16


我也叫wyb(wangyuanbo),是否同名

#17


access数据库无法测定到底是否琐定因为没有事物处理,在事务处理情况下的处理应该是 jxlee365(老牛自知黄昏晚,不待扬鞭自奋蹄) 的处理方式

#18


简单的方法解决,用DataModule,所有对数据库的操作放在一个线程内,懒得考虑冲突了,反正你又不是很多用户的S-C模式

#19


To tiger111222(vo) :
    “对数据库的操作放在一个线程内”是什么意思啊?每分钟操作一次表的动作可以放在一个线程之内,但不定期增加一条记录的动作不好放啊,我也不知道人家什么时候会加记录。
To runnerrunning(我跑步):
    我们不会同名的,三个声母相同的人很多啊!谢谢你,你还是帮我想一下第二个问题为什么不会冲突啦(我试过,好像不会)?

#20