如果客户端读的时候 ,网站也在操作。可能会造成数据不完整或者其他意想不到的问题。
有没有什么方法解决这个? 我用ado 连接 mysql
21 个解决方案
#1
要看什么操作了,如果只是读,没有问题,如果是写入,就可能引起冲突,所以你必须制定写入规则
#2
改用大型数据库,可以支持多客户端读写。
#3
好像有个什么锁机制?
我网页和客户端都有读写操作。侠们 应该怎么做规则啊
我网页和客户端都有读写操作。侠们 应该怎么做规则啊
#4
有没有判断写入状态的
比如客户端写之前,先判断这个表的这个字段是不是有写的行为,如果有 稍后再写(等网页写完再写)
比如客户端写之前,先判断这个表的这个字段是不是有写的行为,如果有 稍后再写(等网页写完再写)
#5
客户端读了之后会修改再写回去吗?
否则,不应该啊
否则,不应该啊
#6
那就是数据库加锁机制,查一下,先弄明白
#7
这么着, 客户端的任务是从数据库中读出字段值,并自动对值加一写回。
同事,网页也有加一写入行为。
不确定什么时候会触发。 所以,发生碰车(都同时写入) 就会产生我预想的问题……
数据库没法换了,必须用mysql。
兄弟们有没有经验?
同事,网页也有加一写入行为。
不确定什么时候会触发。 所以,发生碰车(都同时写入) 就会产生我预想的问题……
数据库没法换了,必须用mysql。
兄弟们有没有经验?
#8
自动对值加一写回,都仅仅使用sql:update tbxxx set fxx=fxx+1 where ...
而不能使用xxx.fields[i].asinteger:=xxx.fields[i].asinteger+1;
而不能使用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)再加一
打开的时候,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;
都使用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数据不能更新
对Image数据不能更新
#16
【这么着, 客户端的任务是从数据库中读出字段值,并自动对值加一写回。
同事,网页也有加一写入行为。
不确定什么时候会触发。 所以,发生碰车(都同时写入) 就会产生我预想的问题……】
Image数据会加一写回
#17
#18
不一定是加一动作 也可能是一个写操作
#19
这就是经典的更新冲突问题,解决问题的办法需要在数据库级加时间戳或版本标志来做控制!
#20
怎么做呢,或者参考资料。 汗颜…… 我是搜索都不知道哪方面问题
#21
查找一下乐观锁!
解决办法一般有二种:时间戳或版本号(即在数据库中加一个字段)
由于ADO这个东西在查询完数据后会把数据放到本地的缓存中,所以当网站与D端同时访问数据后,会在缓存中存一些映像数据。当二个以上客户端在进行更新数据时,往往后更新的动作会把先更新的数据给覆盖掉。基于这个原因,可以在字段后加一个标识,来标识这个记录的版本信息,当数据在网站端被更新后,版本号加1.这时Delphi端也要提交时,就应该先装载记录,判断当前数据库中的版本是否与本地内存的一致。不一致的话,重新LOAD。
解决办法一般有二种:时间戳或版本号(即在数据库中加一个字段)
由于ADO这个东西在查询完数据后会把数据放到本地的缓存中,所以当网站与D端同时访问数据后,会在缓存中存一些映像数据。当二个以上客户端在进行更新数据时,往往后更新的动作会把先更新的数据给覆盖掉。基于这个原因,可以在字段后加一个标识,来标识这个记录的版本信息,当数据在网站端被更新后,版本号加1.这时Delphi端也要提交时,就应该先装载记录,判断当前数据库中的版本是否与本地内存的一致。不一致的话,重新LOAD。
#1
要看什么操作了,如果只是读,没有问题,如果是写入,就可能引起冲突,所以你必须制定写入规则
#2
改用大型数据库,可以支持多客户端读写。
#3
好像有个什么锁机制?
我网页和客户端都有读写操作。侠们 应该怎么做规则啊
我网页和客户端都有读写操作。侠们 应该怎么做规则啊
#4
有没有判断写入状态的
比如客户端写之前,先判断这个表的这个字段是不是有写的行为,如果有 稍后再写(等网页写完再写)
比如客户端写之前,先判断这个表的这个字段是不是有写的行为,如果有 稍后再写(等网页写完再写)
#5
客户端读了之后会修改再写回去吗?
否则,不应该啊
否则,不应该啊
#6
那就是数据库加锁机制,查一下,先弄明白
#7
这么着, 客户端的任务是从数据库中读出字段值,并自动对值加一写回。
同事,网页也有加一写入行为。
不确定什么时候会触发。 所以,发生碰车(都同时写入) 就会产生我预想的问题……
数据库没法换了,必须用mysql。
兄弟们有没有经验?
同事,网页也有加一写入行为。
不确定什么时候会触发。 所以,发生碰车(都同时写入) 就会产生我预想的问题……
数据库没法换了,必须用mysql。
兄弟们有没有经验?
#8
自动对值加一写回,都仅仅使用sql:update tbxxx set fxx=fxx+1 where ...
而不能使用xxx.fields[i].asinteger:=xxx.fields[i].asinteger+1;
而不能使用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)再加一
打开的时候,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;
都使用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数据不能更新
对Image数据不能更新
#16
【这么着, 客户端的任务是从数据库中读出字段值,并自动对值加一写回。
同事,网页也有加一写入行为。
不确定什么时候会触发。 所以,发生碰车(都同时写入) 就会产生我预想的问题……】
Image数据会加一写回
#17
#18
不一定是加一动作 也可能是一个写操作
#19
这就是经典的更新冲突问题,解决问题的办法需要在数据库级加时间戳或版本标志来做控制!
#20
怎么做呢,或者参考资料。 汗颜…… 我是搜索都不知道哪方面问题
#21
查找一下乐观锁!
解决办法一般有二种:时间戳或版本号(即在数据库中加一个字段)
由于ADO这个东西在查询完数据后会把数据放到本地的缓存中,所以当网站与D端同时访问数据后,会在缓存中存一些映像数据。当二个以上客户端在进行更新数据时,往往后更新的动作会把先更新的数据给覆盖掉。基于这个原因,可以在字段后加一个标识,来标识这个记录的版本信息,当数据在网站端被更新后,版本号加1.这时Delphi端也要提交时,就应该先装载记录,判断当前数据库中的版本是否与本地内存的一致。不一致的话,重新LOAD。
解决办法一般有二种:时间戳或版本号(即在数据库中加一个字段)
由于ADO这个东西在查询完数据后会把数据放到本地的缓存中,所以当网站与D端同时访问数据后,会在缓存中存一些映像数据。当二个以上客户端在进行更新数据时,往往后更新的动作会把先更新的数据给覆盖掉。基于这个原因,可以在字段后加一个标识,来标识这个记录的版本信息,当数据在网站端被更新后,版本号加1.这时Delphi端也要提交时,就应该先装载记录,判断当前数据库中的版本是否与本地内存的一致。不一致的话,重新LOAD。