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

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


解决办法:从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使得查询出数据不同,从而解决了并发问题。


猜你喜欢

转载自blog.csdn.net/qq_37421862/article/details/78042189