网站和客户端公用一个数据库的问题

时间:2021-09-17 21:24:04
读写都没问题。现在是

如果客户端读的时候 ,网站也在操作。可能会造成数据不完整或者其他意想不到的问题。

有没有什么方法解决这个? 我用ado 连接 mysql

21 个解决方案

#1


要看什么操作了,如果只是读,没有问题,如果是写入,就可能引起冲突,所以你必须制定写入规则

#2


改用大型数据库,可以支持多客户端读写。

#3


好像有个什么锁机制?
我网页和客户端都有读写操作。侠们   应该怎么做规则啊

#4


有没有判断写入状态的
比如客户端写之前,先判断这个表的这个字段是不是有写的行为,如果有 稍后再写(等网页写完再写)

#5


客户端读了之后会修改再写回去吗?
否则,不应该啊

#6


那就是数据库加锁机制,查一下,先弄明白

#7


这么着, 客户端的任务是从数据库中读出字段值,并自动对值加一写回。
同事,网页也有加一写入行为。 
不确定什么时候会触发。 所以,发生碰车(都同时写入)  就会产生我预想的问题……

数据库没法换了,必须用mysql。  
兄弟们有没有经验?

#8


自动对值加一写回,都仅仅使用sql:update tbxxx set fxx=fxx+1 where ...
而不能使用xxx.fields[i].asinteger:=xxx.fields[i].asinteger+1;

#9


sz_haitao  为啥啊?

#10


使用xxx.fields[i].asinteger:=xxx.fields[i].asinteger+1;
打开的时候,xxx.fields[i].asinteger当时为100
网页可能加了几次,改为105了
而使用xxx.fields[i].asinteger:=xxx.fields[i].asinteger+1;又把它改为101了!

update语句,则始终是对最新的值(105)再加一

#11


!兄弟 正解!!

那个锁,兄弟有办法吗

#12


解法就是
都使用sql:update tbxxx set fxx=fxx+1 where ...
而不能使用xxx.fields[i].asinteger:=xxx.fields[i].asinteger+1;

#13


事务啊事务

#14


并发控制

#15


sql:update tbxxx set fxx=fxx+1 where ...
对Image数据不能更新 

#16


引用 15 楼 lyhoo163 的回复:
sql:update tbxxx set fxx=fxx+1 where ...
对Image数据不能更新

【这么着, 客户端的任务是从数据库中读出字段值,并自动对值加一写回。
同事,网页也有加一写入行为。  
不确定什么时候会触发。 所以,发生碰车(都同时写入) 就会产生我预想的问题……】

Image数据会加一写回

#17


该回复于2010-07-11 15:03:50被版主删除

#18


不一定是加一动作  也可能是一个写操作

#19


这就是经典的更新冲突问题,解决问题的办法需要在数据库级加时间戳或版本标志来做控制!

#20


怎么做呢,或者参考资料。 汗颜…… 我是搜索都不知道哪方面问题

#21


查找一下乐观锁!
解决办法一般有二种:时间戳或版本号(即在数据库中加一个字段)

由于ADO这个东西在查询完数据后会把数据放到本地的缓存中,所以当网站与D端同时访问数据后,会在缓存中存一些映像数据。当二个以上客户端在进行更新数据时,往往后更新的动作会把先更新的数据给覆盖掉。基于这个原因,可以在字段后加一个标识,来标识这个记录的版本信息,当数据在网站端被更新后,版本号加1.这时Delphi端也要提交时,就应该先装载记录,判断当前数据库中的版本是否与本地内存的一致。不一致的话,重新LOAD。

#1


要看什么操作了,如果只是读,没有问题,如果是写入,就可能引起冲突,所以你必须制定写入规则

#2


改用大型数据库,可以支持多客户端读写。

#3


好像有个什么锁机制?
我网页和客户端都有读写操作。侠们   应该怎么做规则啊

#4


有没有判断写入状态的
比如客户端写之前,先判断这个表的这个字段是不是有写的行为,如果有 稍后再写(等网页写完再写)

#5


客户端读了之后会修改再写回去吗?
否则,不应该啊

#6


那就是数据库加锁机制,查一下,先弄明白

#7


这么着, 客户端的任务是从数据库中读出字段值,并自动对值加一写回。
同事,网页也有加一写入行为。 
不确定什么时候会触发。 所以,发生碰车(都同时写入)  就会产生我预想的问题……

数据库没法换了,必须用mysql。  
兄弟们有没有经验?

#8


自动对值加一写回,都仅仅使用sql:update tbxxx set fxx=fxx+1 where ...
而不能使用xxx.fields[i].asinteger:=xxx.fields[i].asinteger+1;

#9


sz_haitao  为啥啊?

#10


使用xxx.fields[i].asinteger:=xxx.fields[i].asinteger+1;
打开的时候,xxx.fields[i].asinteger当时为100
网页可能加了几次,改为105了
而使用xxx.fields[i].asinteger:=xxx.fields[i].asinteger+1;又把它改为101了!

update语句,则始终是对最新的值(105)再加一

#11


!兄弟 正解!!

那个锁,兄弟有办法吗

#12


解法就是
都使用sql:update tbxxx set fxx=fxx+1 where ...
而不能使用xxx.fields[i].asinteger:=xxx.fields[i].asinteger+1;

#13


事务啊事务

#14


并发控制

#15


sql:update tbxxx set fxx=fxx+1 where ...
对Image数据不能更新 

#16


引用 15 楼 lyhoo163 的回复:
sql:update tbxxx set fxx=fxx+1 where ...
对Image数据不能更新

【这么着, 客户端的任务是从数据库中读出字段值,并自动对值加一写回。
同事,网页也有加一写入行为。  
不确定什么时候会触发。 所以,发生碰车(都同时写入) 就会产生我预想的问题……】

Image数据会加一写回

#17


该回复于2010-07-11 15:03:50被版主删除

#18


不一定是加一动作  也可能是一个写操作

#19


这就是经典的更新冲突问题,解决问题的办法需要在数据库级加时间戳或版本标志来做控制!

#20


怎么做呢,或者参考资料。 汗颜…… 我是搜索都不知道哪方面问题

#21


查找一下乐观锁!
解决办法一般有二种:时间戳或版本号(即在数据库中加一个字段)

由于ADO这个东西在查询完数据后会把数据放到本地的缓存中,所以当网站与D端同时访问数据后,会在缓存中存一些映像数据。当二个以上客户端在进行更新数据时,往往后更新的动作会把先更新的数据给覆盖掉。基于这个原因,可以在字段后加一个标识,来标识这个记录的版本信息,当数据在网站端被更新后,版本号加1.这时Delphi端也要提交时,就应该先装载记录,判断当前数据库中的版本是否与本地内存的一致。不一致的话,重新LOAD。