我通过Rest API调用Java线程。当用户单击“处理”按钮时,将调用此方法
@Override
public String processTags(ServiceExecutionContext ctx, SetTag tags) throws ExecException {
Thread t = new Thread(new TagService(customerId, tags));
t.setName("Thread at "+new Date());
t.start();
return "Processing started in background";
}
在TagService的运行方法
中@Override
public void run() {
ServiceExecutionContext ctx = null;
try {
ctx = getServiceExecutionContextForCustomer(this.customerId);
performUpdate(ctx,this.tags)
} catch (HibernateException e) {
e.printStackTrace();
} finally {
if(ctx != null)
ctx.teardownNormal();
}
}
public static void performUpdate(ServiceExecutionContext ctx, String tags){
String q = "Select column1 from table where id=1";
List<String>list = ctx.getSession().createQuery(q).list();
String currentVal = list.get(0);
String newVal = currentVal + tag;
String q1 = "Update table set column1=?";
ctx.getSession().createQuery(q1).setParameter(0,newVal).executeUpdate();
}
假设两个用户一个接一个地请求进程。 Thread-1的值为A,Thread-2的值为B. Thread-1启动:从表中获取值表示它为空它将值A放入,现在在Thread-1提交之前,事务thread-2启动。当thread-2提取数据时,由于thread-1没有提交更改,因此该数据值仍为空。所以线程2它将B附加到空值。
当两个线程都提交事务时,用户将期望AB作为值,而是获得“B”。我怎么处理这个?