关于并发问题 假如说有一张表,只有一个字段,A来读的时候是4,要求读完之后把这个字段的值修改成5,那B来读的时候就是5。那会出现这种情况么,就是同时有10个人来读数据库,读到的都是4这就是并发问题,大侠能写出个多线程证实么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 呵。很想写一个。但实在是有点忙,你可以百度一下synchronized,他是解决这块线程同步的问题。这个线程块就像单个公厕,A进去上了,B在门口排队等A出来再进去。 当然会出现那种问题,也很容易实现你起10个线程一起读数据库并打印,读完后sleep1秒钟,然后再改数据库,情况一目了然 以下代码供你参考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(); }}数据库上不加写锁,就很可能会出现这种情况。 楼主想要比较访问速度和更新速度吗?我也不是很清楚,但好像俺觉得CPU都是同一时间只能干一件事情。即便10个人同时访问,即便是多线程,服务器都是一个指令一个指令的处理。楼主想要测试的是更新过程中是不是有时间完成10个人的查询吗?为什么数据库查询时有锁,防止的就是楼主要证实的这种访问。反过来就是说,如果不上锁情况就难以把握,会出现不希望的结果。更新之前取的都是一样的值,更新之后取的是+1之后的值,所以10个人同时来访问,作为推测,有一种最大的可能就是有2,3个人取的数据是一样的但和其他人是不一样的。这取决于服务器的处理速度和处理进程的顺序。也就是说,根据数据库服务器的状态和执行情况都有关系。 多线程的话读到的有可能一样。A--读取数据 B--读取数据 A--更新数据 A--提交数据 A--读取数据 A--更新数据 B--读取数据 A--提交数据A,B代表线程,同样可以扩展到10个线程的情形 这不是脏读么?数据库隔离级别中READ_UNCOMMITED可以实现把,不过我对怎样设置没有实践过 这是很正常的事情啊!你事务没提交前,数据库的值是不会变的。读到4是对的。不过这还是要看数据库的隔离级别。目前大多数数据库默认的级别都是在事务提交后,其它事务才能看到更新后的数据。并发上的错误主要发生在同时修改或删除一条记录上。比如A读取一条记录修改,B这时候也读取了这条记录。A提交后,马上B也提交,A的修改就会被B覆盖这个时候就要用数据库的锁机制。不过大多数是用乐观锁。 jsp页面传值中文乱码问题 Hibernate 添加监听器问题 谁有关于程序员的群呀,本人现加入 ssh 开发,tomcat 报错 hibernate3 c3p0连接池 db2V8 操作sql语句报错 关于OJB查询数据问题 SpringMvc+hibernate实现两个oracle数据库操作 静态成员调用的问题: 为什么要将tomcat与apache整合?初学者问题 这两种实现的方式为什么不同(有关struts的checkbox) servlet过滤器问题, 如何处理用户在地址栏非法输入 一个复杂的多表关联的条件查询!
你起10个线程一起读数据库并打印,读完后sleep1秒钟,然后再改数据库,情况一目了然
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();
}
}
数据库上不加写锁,就很可能会出现这种情况。
我也不是很清楚,但好像俺觉得CPU都是同一时间只能干一件事情。
即便10个人同时访问,即便是多线程,服务器都是一个指令一个指令的处理。
楼主想要测试的是更新过程中是不是有时间完成10个人的查询吗?
为什么数据库查询时有锁,防止的就是楼主要证实的这种访问。
反过来就是说,如果不上锁情况就难以把握,会出现不希望的结果。更新之前取的都是一样的值,更新之后取的是+1之后的值,所以10个人同时来访问,
作为推测,有一种最大的可能就是有2,3个人取的数据是一样的但和其他人是不一样的。
这取决于服务器的处理速度和处理进程的顺序。
也就是说,根据数据库服务器的状态和执行情况都有关系。
B--读取数据
A--更新数据
A--提交数据
A--读取数据
A--更新数据
B--读取数据
A--提交数据
A,B代表线程,同样可以扩展到10个线程的情形
不过这还是要看数据库的隔离级别。目前大多数数据库默认的级别都是在事务提交后,其它事务才能看到更新后的数据。
并发上的错误主要发生在同时修改或删除一条记录上。比如A读取一条记录修改,B这时候也读取了这条记录。
A提交后,马上B也提交,A的修改就会被B覆盖
这个时候就要用数据库的锁机制。不过大多数是用乐观锁。