日期:2014-05-18  浏览次数:20747 次

关于同意线程,并发,同步的问题!
问题描述:
   在同一时间同一个方法被执行了2次。查看日志文件如下描述的:
    log4j配置格式如下:
    [log_message\:]%m, [log_thread\:]%t (%t就是执行该事件的线程吧?)
    日志信息如下:
    [log_message:]开始插入数据, [log_thread:]TestScheduler_Worker-1,[log_time:]2013-03-06     
    16:10:00 
    [log_message:]开始插入数据, [log_thread:]TestScheduler_Worker-1 ,[log_time:]2013-03-06 
    16:10:00 
   这个是同一个线程TestScheduler_Worker-1在执行吗?那么看后面的时间几乎是同一时刻执行的。
   这也就麻烦了 我打开数据库查看数据库里面确实有2条数据完全相同的,并且插入时间一样(就是和日志时   
   间显示的时间一样都是2013-03-06 16:10:00 )
我的业务逻辑是:
    如果存在数据库存在那么一条数据(某种条件下查询出来的)就把后面的数据叠加即可。上面的情形下   
    数据没有叠加而是同一时刻插入了2条相同数据(理想是:2条叠加为一条)。
我想问问:
     这个是不是同一线程的并发情况???还是不同线程的同时执行情况?
     如果是并发?那么假如是注册用户 这样的并发情况恐怕几率就很大了,同一时刻多个用户使用相同的用户名来注册?本来该先检测的,但是由于并发执行,在第一条插入的同时其余几条也插入了 那么数据库就有相同的用户名多个了?这种情况 如何避免!!
       

    

------解决方案--------------------
Transaction
------解决方案--------------------
数据库的表自己都有锁的吧  怎么可能是同一时间插了两条数据进去   
肯定是业务逻辑的代码出了问题吧,重复调用了action什么的
------解决方案--------------------
同一个线程添加的,跟并发有什么关系?你仔细检查一下你的程序是不是有问题。
------解决方案--------------------
你可以采用计数器去做这事,也可以按照数据库原子性去实现