简单的多终端对同一数据的互斥插入
相关问题说明:
两台设置了F5的服务器上,要求部署完全相同程序代码的应用。
设置了一个定时任务,每天向日志表中插入数据。如果不做限制,一定会生成两条重复的记录。现在要求数据库中的数据不能重复。
基本策略:
各个服务器上的应用向数据库中执行了查询锁行操作(select * from .... where .... for update),如果有数据则返回false,如果没有数据则插入需要日志数据。
主要代码:
/**
* 检查是否需要生成支付对账文件
* @param dateTime
* @return
*/
public boolean checkNeedGenPayChkFile(PayOrderCheckGenLog log, String dateTime) {
String sql = "SELECT COUNT(*) FROM T_PAY_ORDER_CHECK_GEN_LOG WHERE CHECK_DATE = ? for update ";
int count = this.getJdbcTemplate().queryForInt(sql,
new Object[] { dateTime });
if (count == 0) {
// insert;
long id = sequence12.nextLongValue();
String sql2 = "INSERT INTO T_PAY_ORDER_CHECK_GEN_LOG(CHECK_ID,CHECK_DATE,GATHER_CHECK_FILENAME,STATE,CREATE_TIME ) VALUES(?,?,?,'1',SYSDATE)";
this.getJdbcTemplate().update(
sql2,
new Object[] { id, log.getCheckDate(),
log.getGatherCheckFilename() });
return true;
} else {
return false;
}
}
注:在SERVICE中编写方法,用 @Transactional 将其下的方法设定为原子方法。