多线程webservice服务端--insert多条相同数据

本文讨论了在Web服务端处理多客户端请求时可能出现的并发问题,即由于同步机制不足导致的同一条数据被插入两次。通过一个具体的例子展示了线程1和线程2在查询数据库并尝试插入数据时可能遇到的冲突。为了解决这个问题,文章提出了使用同步锁(synchronized关键字)来确保同一时刻只有一个线程能执行插入操作。然而,当涉及到多服务器环境时,简单的同步锁无法跨服务器生效,可能导致数据不一致。文章以此引发对分布式环境下数据一致性解决方案的思考。

一般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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值