Topic: 关于并发性操作的讨论

  Print this page

1.关于并发性操作的讨论 Copy to clipboard
Posted by: gunrose
Posted on: 2003-03-20 11:35

首先说明,我不知道我这个贴该放在哪儿.但是我考虑到一般情况下,并发性操作都是针对企业级的系统开发,所以放在这儿了.

如果版主认为我放错地方,移走就是,千万别扣分(我刚才看到一贴说放错地方要扣分的).如果扣了,我会不会变-1?那样的话,离1分就更远了.Big Smile

平常我们在做程序时,为了考虑并发性操作的问题,都是在对象和数据库中放置一个timeStamp字段,在用户操作前,先和其它数据字段一起取出,放到model或者view层中(例如web app),当用户操作时,必须要保证对象的timeStamp和数据库中的一致,才可以操作,否则rollback.

在web app中,我们当前的系统使用的是struts+EJB.本来数据可以放到http 的session中来缓存,但是我们考虑到当用户量大时session中的数据会占用服务器的大量内存.因此只允许把数据放到request中,用完就丢.如果需要跨页面传输,就在jsp中hidden.那么对象中的所有信息需要hidden到jsp中,包括timeStamp.

现在地问题是,大家有没有更好的方法来处理这种web app的并发操作?
或者在做其它类型的app中,有更好的并发操作的处理方式?
有相关书籍或者文章吗?

BTW,在做企业级的app开发当中,有哪些是必须考虑到的问题?例如并发操作,安全,权限,性能,还有哪些呢?

2.Re:关于并发性操作的讨论 [Re: gunrose] Copy to clipboard
Posted by: rainman
Posted on: 2003-03-24 02:39

应该可以用数据库锁来控制啊。

3.Re:关于并发性操作的讨论 [Re: rainman] Copy to clipboard
Posted by: gunrose
Posted on: 2003-03-24 12:52

由于是基于web的系统,要考虑以下问题:
问题是在什么时候锁?性能会否降低?
如果用户中途退出会否有问题?
如果用户连续两次提交相同的信息会如何?

能否详细介绍一下数据锁的方案?谢谢!

4.Re:关于并发性操作的讨论 [Re: gunrose] Copy to clipboard
Posted by: rainman
Posted on: 2003-03-24 13:11

比如下订单。
两个人同时要购买同一件商品,而商品数量只有1个。
这时候你就要加锁了。
1.lock 商品库存表,设置auto commit =false;
2.query 出还有一个商品,交易继续;
3.将库存减1
4.将商品加到用户的order里
5.commit交易,unlock商品库存表

如果不上锁,第3步的时候可能会得出负数来。
如果第4步出错了,那么可以取消交易,本来减1为0的库存又变成1了,这样再等lock的第二个用户可以在获得锁以后继续处理。

如果用EJB来实现,也可以将提交订单的方法标记为同步(需要满足分布式)。如果是简单的load balance的web 应用那么用数据库锁来就是最保险的了。

我想这不会有什么效率问题,因为提交的次数不会比浏览次数多,否则如果真的很多的话,说明你就赚了很多钱,那再买一台服务器好了。

因为启动了事务处理,所以用户中途退出也不用担心啊。

连续提交两次表单这是另外一个问题了。
我也看到过好几种处理办法,一种是在数据库(DB2上),还有一种在客户端上用随机数来标记,还有一种就是交易完一次就把服务器端的数据标记一下,这样第二次的时候状态就不对了,throw IllegalStateException..

5.Re:关于并发性操作的讨论 [Re: rainman] Copy to clipboard
Posted by: gunrose
Posted on: 2003-03-25 13:21

我同意你的处理方式,实际上就是transaction的问题。谢谢你的答复。

可能我没有表达清楚。我实际上关心的是你最后面回答的那一部分:
【我也看到过好几种处理办法,一种是在数据库(DB2上),还有一种在客户端上用随机数来标记,还有一种就是交易完一次就把服务器端的数据标记一下,这样第二次的时候状态就不对了,throw IllegalStateException.. 】

对于这些不同的处理方式,有什么更具体的描述,或者评比。
有没有相关的书籍或例子可以参考?

我目前的处理方法是在数据库加timeStamp类型的字段:lastModifiedDate.当要更新数据库时(update或者delete),先开始transaction,find ejb,如果ejb的lastModifiedDate和用户得到的lastModifiedDate不一致,就rollback,并抛出DataModifiedException(自定义的)。否则,commit

6.Re:关于并发性操作的讨论 [Re: gunrose] Copy to clipboard
Posted by: rainman
Posted on: 2003-03-25 13:24

这是一个common issue,放眼internet,到处都是资料啊。

http://www.google.com/search?hl=zh-CN&ie=UTF-8&oe=UTF-8&q=double+submit&lr=

http://www.google.com/search?q=%E9%87%8D%E5%A4%8D%E6%8F%90%E4%BA%A4%E8%A1%A8%E5%8D%95&ie=UTF-8&oe=UTF-8&hl=zh-CN&lr=


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923