hhlux
2008-11-18 14:28
浏览 188
已采纳

关于程序互相调用

标题描述得不是特别清楚。一个很菜鸟的问题,实际情况是这样,项目是一个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就不起作用了?

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • bohemia 2008-11-18 15:05
    已采纳

    [quote]1.你说的线程控制是不是就是指用syncronized ? [/quote]
    是的.同一个应用内,可以用线程控制并发;

    [quote]2.如果是并列服务器,syncronized就不起作用了? [/quote]
    如果是并列服务器,这个控制可能会有问题的;
    需要数据库端做处理,或者采用统一入口,或者找其他办法了.

    已采纳该答案
    打赏 评论
  • bohemia 2008-11-18 14:32

    syncronized dbOperation(){
    step0: 开启事务;
    step1: 获取数据表1的Code;
    step2: 插入到表2的Code主键;
    step3: Commit(Rollback)
    }

    :)

    打赏 评论
  • bohemia 2008-11-18 14:34

    另外,可考虑从数据库设计方面,避免这种情况出现; 没必要非要插入一个主键字段;

    打赏 评论
  • bohemia 2008-11-18 14:42

    WEB层框架,基本上都是基于线程的.因为Servlet都是线程实现方式的;

    Struts2请求也是线程的;

    业务方法,做好线程控制,就能防止 同一台机器的多个请求出现的问题;

    但如果你的系统有多台并列服务器,就需要采用其他方式来避免了. 采用存储过程或者其他方式吧?

    避免问题,总比解决问题要好; 应该有好的办法避免这个问题

    打赏 评论

相关推荐 更多相似问题