一般websercvice服务端,可以同时接收多个客户端发送的信息,并且保存数据库;
基础的写法是
1)根据关键字查询数据库表是否存在数据
2)判断查询到的消息是否存在
3)
3.1不存在数据,调用insert
3.2存在数据,调用update
上面的写法一般不会出错;
多线程的模式下,会出现一种情况是
例子描述:线程1:根据关键字查询了数据表没对应的数据,准备insert的时候,线程2进来一条同样的信息,根据关键字查询了数据表;同一时间点,线程1是还没insert事务提交完成,数据库表也是没有数据的,线程2 查询没有对应数据,同样调用了insert; **导致同一条数据insert两次**
为了应对这种情况,可以添加同步锁
例子:
**synchronized(this){//同步锁**
a (//返回的数据)=select(查询语句);
if(a==null||a.equals("***")){//判断是否存在
insert()
}else{
update();
}
**}**
那么程序执行到这一步的时候,如果有数据在执行中,那么会等待完成后,在执行;
以上操作 试用单个服务器的情况;如果多个服务器模式,synchronized 无法阻止同一条信息多次insert
本文讨论了在Web服务端处理多客户端请求时可能出现的并发问题,即由于同步机制不足导致的同一条数据被插入两次。通过一个具体的例子展示了线程1和线程2在查询数据库并尝试插入数据时可能遇到的冲突。为了解决这个问题,文章提出了使用同步锁(synchronized关键字)来确保同一时刻只有一个线程能执行插入操作。然而,当涉及到多服务器环境时,简单的同步锁无法跨服务器生效,可能导致数据不一致。文章以此引发对分布式环境下数据一致性解决方案的思考。
1万+

被折叠的 条评论
为什么被折叠?



