是这样的.
数据库中有1000条数据.
现在有10个财务.
每个财务请求获取10条数据.
我为了防止这10个财务在同时获得一样的数据.
我想问一下spring有这样的机制嘛?就是说同时10个人发了10个请求过来.但是action只有一个而且action是一个一个处理请求.如:处理第一个的时候其他9个都处于等待的状态.只有第一个从action中出去了,才接待第二个.
以此类推.spring可以这样设置吗?如果不能这样的话我只能手动去同步了.
数据库中有1000条数据.
现在有10个财务.
每个财务请求获取10条数据.
我为了防止这10个财务在同时获得一样的数据.
我想问一下spring有这样的机制嘛?就是说同时10个人发了10个请求过来.但是action只有一个而且action是一个一个处理请求.如:处理第一个的时候其他9个都处于等待的状态.只有第一个从action中出去了,才接待第二个.
以此类推.spring可以这样设置吗?如果不能这样的话我只能手动去同步了.
解决方案 »
- 高分求助:使用javamail包为什么会打印邮件内容到控制台?,有答案马上结贴!
- post请求带字段和表头到某个网站
- eclipse 起动tomcat问题
- jsp页面传值的问题
- 做验证码注册用户,为什么总是新建session?
- 这个问题这么难吗???怎么没人回复
- CMP的编写+myeclipse
- 很简单,但是很奇怪!!!struts 页面上的问题!!
- 不是高手莫入,以免误人子弟 ,一个简单的问题 ???
- 我是XML的新手,请问Java和XML怎样结合比较好些?
- eclipse 及 MyeclipseWeb开发配置
- spring mvc中org.springframework.web.servlet.DispatcherServlet类的行文是怎么样的?
没有直接这样的机制,不过Spring对于bean默认都是单例模式,所以你只要在函数上增加一个 synchronized 关键字,就全部都同步掉了。
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class Service implements ServiceLocal {
@Override
@Lock(LockType.WRITE)
public void doSomething() {
}
}
我刚才也想过这种形式.就是bean本身就是单例的
然后在方法中增加synchronized 同步化
但是他真的能做到我在帖子里说到的那种吗?我有点怀疑.所以来问问大家.
如果你无法确定是单例,那么就让该函数再调用一个 private static synchronized xxoo()
不过,我重新看了下你的问题,我觉得可能存在一个误区:
“如:处理第一个的时候其他9个都处于等待的状态.只有第一个从action中出去了,才接待第二个”
并不等同于:
“防止这10个财务在同时获得一样的数据”
因为即便你轮流执行10次:Select Top 10 * From 表; 实际上每次你还是得到相同的结果啊。
Select Top 10 * From ... For Update
然后对ResultSet进行修改(updateXXOO),最后 commit();数据库为了保证事务一致性,会把你所选择出来的记录集锁定住(行锁或表锁),这样就控制住并发了。
这个是可以的.我的框架里面带着事物控制的.如果出错会全部回滚.
我用的hibernate+杭锁就可以了.
"在Struts2与Spring集成时,配置Action的Bean时一定记得加上scope属性,值为:prototype,否则会有线程安全问题。 "
我要是把他设置成单例的话会有线程安全问题吗?我有点蒙了.
它说的是Action的“Bean”,如果所有请求都共享一个“Bean”,那不是死定了
晕...下我一跳...我把他的话看成了Action...如果吧Action设置成了prototype的话不就没啥用了嘛...我在在数据查询和更新的时候增加了hibernate事物,就怕在做更新数据库状态操作的时候出现错误...不过估计应该不会出错误...action已经是单例了在加上synchronized已经可以了万一出现错误了还有事物可以去控制回滚一下...这就足够了吧.
理论上是绝对够了的。不过我补充下:
数据库层面的控制是最合理且安全的,而且基本上就以数据库实现为准。
synchronized的潜在问题是:集群。如果你的部署环境是集群环境,那么synchronized可没法在多个JVM之间保证同步;所以你看到,为啥我说数据库层面控制才是最安全的。所以,为了避免编码级的疏漏,你要故意做些测试,控制好两个请求同时去操作数据库(比如在Select之后增加Sleep(10000),然后再做其它处理,然后继续Sleep(10000),然后再提交)。关键性设计和实现必须得到验证,否则从技术人员角度来说,是不严谨的做事方法。
我这里暂时不会集群.而且我加了hibernate的事物如果出现错误了就直接回滚了,不返回给页面数据了.而是提示他有错误了.数据库方面实现的话要如何实现呢?我这里用的是mysql简单提一下吧谢谢