假如说有一张表,只有一个字段,A来读的时候是4,要求读完之后把这个字段的值修改成5,那B来读的时候就是5。
那会出现这种情况么,就是同时有10个人来读数据库,读到的都是4这就是并发问题,大侠能写出个多线程证实么?

解决方案 »

  1.   

    呵。很想写一个。但实在是有点忙,你可以百度一下synchronized,他是解决这块线程同步的问题。这个线程块就像单个公厕,A进去上了,B在门口排队等A出来再进去。
      

  2.   

    当然会出现那种问题,也很容易实现
    你起10个线程一起读数据库并打印,读完后sleep1秒钟,然后再改数据库,情况一目了然
      

  3.   

    以下代码供你参考
    public class DirtyReadDemo {
    private int flag = 4;
    public void doit(){
    int temp = flag;
    System.out.println("主线程读取值为:" + temp);
    for (int i=0; i<10; i++){
    new Thread(String.valueOf(i)){
    @Override
    public void run(){
    int temp = flag;
    System.out.println("线程" + this.getName() + "读取值为:" + temp);
    }
    }.run();
    }
    try {
    Thread.sleep(2000);
    } catch (InterruptedException e) {}
    temp++;
    flag = temp;
    System.out.println("主线程读取修改后的值为:" + flag);
    }
    public static void main(String[] args) {
    DirtyReadDemo demo = new DirtyReadDemo();
    demo.doit();
    }
    }
    数据库上不加写锁,就很可能会出现这种情况。
      

  4.   

    楼主想要比较访问速度和更新速度吗?
    我也不是很清楚,但好像俺觉得CPU都是同一时间只能干一件事情。
    即便10个人同时访问,即便是多线程,服务器都是一个指令一个指令的处理。
    楼主想要测试的是更新过程中是不是有时间完成10个人的查询吗?
    为什么数据库查询时有锁,防止的就是楼主要证实的这种访问。
    反过来就是说,如果不上锁情况就难以把握,会出现不希望的结果。更新之前取的都是一样的值,更新之后取的是+1之后的值,所以10个人同时来访问,
    作为推测,有一种最大的可能就是有2,3个人取的数据是一样的但和其他人是不一样的。
    这取决于服务器的处理速度和处理进程的顺序。
    也就是说,根据数据库服务器的状态和执行情况都有关系。
      

  5.   

    多线程的话读到的有可能一样。A--读取数据
              B--读取数据
                        A--更新数据
                                  A--提交数据
              
    A--读取数据
              A--更新数据
                        B--读取数据
                                  A--提交数据
    A,B代表线程,同样可以扩展到10个线程的情形
              
      

  6.   

    这不是脏读么?数据库隔离级别中READ_UNCOMMITED可以实现把,不过我对怎样设置没有实践过
      

  7.   

    这是很正常的事情啊!你事务没提交前,数据库的值是不会变的。读到4是对的。
    不过这还是要看数据库的隔离级别。目前大多数数据库默认的级别都是在事务提交后,其它事务才能看到更新后的数据。
    并发上的错误主要发生在同时修改或删除一条记录上。比如A读取一条记录修改,B这时候也读取了这条记录。
    A提交后,马上B也提交,A的修改就会被B覆盖
    这个时候就要用数据库的锁机制。不过大多数是用乐观锁。