吴
吴剑明
Unregistered / Unconfirmed
GUEST, unregistred user!
大家都知道,在这种C/S环境下,很容易出现的问题就是:
情况A:
数据库中A字段值为10,B用户向他查询后,在B用户的客户机上就显示为10,B向
他加了5,得到15,就在B向数据库COMMIT 15时,C用户抢先把数据库的A值改为了20,
按理来说,A值正确应为25,可是B客户COMMIT 是15,结果A值变成了15,足足少了10。
小弟的做法是:
1: 给数据库A值加“锁”,在他COMMIT前,禁止C用户修改。
缺点: 如果B用户一直不COMMIT,所有的用户都无法修改该字段,效率极低。
2: 让数据库自己加值,即A= A+N,N为任意数值。且每次修改后,立即COMMIT,
这样在情况A中,尽管C用户抢先修改了A值,但B COMMIT时,因为A值是20,所以
由A=A+N,那么A=20+5,所以数值就不会搞错。
缺点: 老是COMMIT,方法笨,网络传输量大,一些如利用本地临时表,本地缓存
等技术无法使用。
我有点想不通的是,那些利用本地临时表、缓存技术的程序,是如何解决情况A中所说的问
题的?
我知道很多高手是清楚这一点的。所以想请教一下。
我笨笨,请大家见笑。
情况A:
数据库中A字段值为10,B用户向他查询后,在B用户的客户机上就显示为10,B向
他加了5,得到15,就在B向数据库COMMIT 15时,C用户抢先把数据库的A值改为了20,
按理来说,A值正确应为25,可是B客户COMMIT 是15,结果A值变成了15,足足少了10。
小弟的做法是:
1: 给数据库A值加“锁”,在他COMMIT前,禁止C用户修改。
缺点: 如果B用户一直不COMMIT,所有的用户都无法修改该字段,效率极低。
2: 让数据库自己加值,即A= A+N,N为任意数值。且每次修改后,立即COMMIT,
这样在情况A中,尽管C用户抢先修改了A值,但B COMMIT时,因为A值是20,所以
由A=A+N,那么A=20+5,所以数值就不会搞错。
缺点: 老是COMMIT,方法笨,网络传输量大,一些如利用本地临时表,本地缓存
等技术无法使用。
我有点想不通的是,那些利用本地临时表、缓存技术的程序,是如何解决情况A中所说的问
题的?
我知道很多高手是清楚这一点的。所以想请教一下。
我笨笨,请大家见笑。