标题描述得不是特别清楚。一个很菜鸟的问题,实际情况是这样,项目是一个STRUTS2的WEB应用程序,ACTION里有个方法,先从一张表里读取一个CODE,再把这个CODE作为主键插入另外一张表,也就是说,两个DB操作。
问题是这样,如果两台机器的两个用户同时调用这个方法,有可能会出现这种情况:两个人取得的CODE都是一样的,然后两个人用相同的CODE插DB,DB就报错了。
我的疑问是,读CODE和插DB是在一个方法里的两个DB操作,执行速度应该是很快的,为什么会出现上述这种情况呢?这种情况跟线程,进程什么的有关系吗?
[b]问题补充:[/b]
标题描述得不是特别清楚。一个很菜鸟的问题,实际情况是这样,项目是一个STRUTS2的WEB应用程序,ACTION里有个方法,先从一张表里读取一个CODE,再把这个CODE作为主键插入另外一张表,也就是说,两个DB操作。
问题是这样,如果两台机器的两个用户同时调用这个方法,有可能会出现这种情况:两个人取得的CODE都是一样的,然后两个人用相同的CODE插DB,DB就报错了。
我的疑问是,读CODE和插DB是在一个方法里的两个DB操作,执行速度应该是很快的,为什么会出现上述这种情况呢?这种情况跟线程,进程什么的有关系吗?
看了bohemia的回答,里面有syncronized关键字,JAVA里syncronized是用于同步线程的,这里用syncronized是不是意味着STRUTS2的请求都是基于线程的?
或者是说,关于STRUTS2的请求是线程还是进程呢?
不知道有没有问到点上呢。
[b]问题补充:[/b]
非常高兴的感谢bohemia的回答,解决了我心中的疑惑。还想再问一下,
1.你说的线程控制是不是就是指用syncronized ?
2.如果是并列服务器,syncronized就不起作用了?
[quote]1.你说的线程控制是不是就是指用syncronized ? [/quote]
是的.同一个应用内,可以用线程控制并发;
[quote]2.如果是并列服务器,syncronized就不起作用了? [/quote]
如果是并列服务器,这个控制可能会有问题的;
需要数据库端做处理,或者采用统一入口,或者找其他办法了.
syncronized dbOperation(){
step0: 开启事务;
step1: 获取数据表1的Code;
step2: 插入到表2的Code主键;
step3: Commit(Rollback)
}
:)
另外,可考虑从数据库设计方面,避免这种情况出现; 没必要非要插入一个主键字段;
WEB层框架,基本上都是基于线程的.因为Servlet都是线程实现方式的;
Struts2请求也是线程的;
业务方法,做好线程控制,就能防止 同一台机器的多个请求出现的问题;
但如果你的系统有多台并列服务器,就需要采用其他方式来避免了. 采用存储过程或者其他方式吧?
避免问题,总比解决问题要好; 应该有好的办法避免这个问题