多台应用同时操作一张表数据,解决并发问题

遇到的问题:多台应用部署调度任务,同时扫一张表的数据,并且对一张表的数据进行操作,可能出现的问题是一条数据被操作了两次,从而出现了并发性的问题。


解决办法:从sql上解决问题,并且限制查询条数。
例:假设三台应用部署调度任务。
对数据表的主键取余,若是被除数配置为4,则所有的余数为0,1,2,3。所以需要保证每台应用所执行的sql里面刚好包含这4个数字。当然需要在程序里面根据配置文件的不同,对sql进行拼接。

JAVA程序如:
 
                String[] arr=elcluster.split(",");
		StringBuilder sb=new StringBuilder();
		sb.append("( ");
		for (int i = 0; i < arr.length; i++) {
			if(i==arr.length-1){
				sb.append(" mod(sep.rdid,"+Dividend+")=  " + arr[i]);
			}else{
				sb.append(" mod(sep.rdid,"+Dividend+")= "+arr[i]+" or ");
			}
		}
		sb.append(" )");
		String pieceSql = sb.toString();
property文件配置方式:创建三个property文件,比如第一个里面内容为0,1,则第二个里面内容为2,第三个为3。之后将他们放在一个统一的路径,确保每个应用均能读取到这个property文件。

DB2数据库sql写法:
SELECT temp.* FROM (SELECT * FROM TABLE_NAME WHERE 
--此处引用以上的pieceSql 
ORDER BY PK_NAME DESC) 
temp WHERE rownum<1000
ORACLE数据库sql写法
SELECT temp.* FROM (SELECT * FROM TABLE_NAME WHERE
--此处引用以上的pieceSql	
ORDER BY PK_NAME DESC) 
temp WHERE rownum<1000
	
第一台应用所执行的sql样例为:
SELECT temp.* FROM (SELECT * FROM TABLE_NAME WHERE
MOD(PK_NAME,4) = 0 OR MOD(PK_NAME,4) = 1  
ORDER BY PK_NAME DESC) 
temp WHERE rownum<1000
结论:通过改变查询sql使得查询出数据不同,从而解决了并发问题。


  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值