我在多线程程序中运行以下代码并得到异常:-
org.hibernate.exception.约束违反异常:错误:重复的键值违反唯一约束"value_pkey"
@Stateless
@TransactionAttribute(javax.ejb.TransactionAttributeType.REQUIRED)
public class GetHelloBean{
@PersistenceContext(unitName = "test-unit")
private EntityManager entityManager;
public Hello<?> insertOrUpdateHello(Hello<?> value) {
Hello<?> existing = null;
try {
existing = this.entityManager.find(Hello.class,
value.getKey());
if (existing != null) {
value = this.entityManager.merge(value);
} else {
this.entityManager.persist(value);
}
this.entityManager.flush();
} catch (Exception e) {
this.logger.error(" value not saved : " + value.toString()
+ " of class " + value.getClass() + ":" + e.getMessage());
}
//
return value;
}
}
有人能解释一下为什么以及我该如何处理这件事吗?
此错误可能是由代码中的竞争条件引起的。如果两个或多个线程试图用相同的键更新Hello实体,则它们可能都从查找返回了一个null
,并将尝试持久化该实体。因此,只有“最快”的线程会成功,而其他线程会遇到约束冲突。
如果value.getKey()
是Hello实体的主键,那么只执行合并(...)
就足够了。Hibernate将检查该实体是否已经存在于数据库或缓存中,并根据此执行INSERT或UPDATE。尽管并发执行仍然可能产生意想不到的结果(感知到乱序更新)。
如果它不是Hello实体的主键,也许这个答案可以帮助您。
问题内容: 线程ID和线程句柄有什么区别?为什么两者都需要?Windows和Linux之间有区别吗? 问题答案: 据我所知,Linux的pthread库没有线程句柄的概念。pthread_create和其他pthreads函数,返回线程ID。 在Windows下,线程句柄不同于线程ID,就像文件句柄不同于文件名一样。 线程句柄是一个令牌,它使您可以对线程执行某些操作(通常等待或杀死它)。Win32
问题内容: 嘿,SO Guru的即时通讯工作非常顺利, 当我第一次运行程序时,它尝试运行代码时遇到此错误 经过一番摸索,这似乎是线程通常会发生的错误,为什么它们尝试同时访问同一资源,但这就是让我在该系统中根本不使用多线程的原因。 有人可以解释为什么会这样,还是想办法解决它 非常感谢^ _ ^ 问题答案: 您可以修改底层的(这是隐藏在环)。正确的方法是:
我在准备好的语句中使用了命令,当我在单线程环境中执行它时,它的工作很好,但是在多线程环境中,它会引起一些问题,那就是数据重复,即如果我有5个线程,每个记录会重复5次,我认为db中没有锁来帮助线程。我的代码: 如果employee.size=5,thread count=5,执行后我将得到25条记录,而不是5条
问题内容: 我刚刚开始进行android开发,并且更新UI确实使我很烦:/ 到目前为止,这是我一直在努力的工作- 它工作正常,但是每个人都说要在主线程中做图形,所以我正在尝试(但失败)将其传递给另一个线程。麻烦的是,我真的不知道怎么做,因为我从未真正使用过线程。 Google给出的有关使用Threads的示例似乎并不十分清楚,我也无法真正按照自己的意愿去做。我可以请某人在这里给我一个最基本的例子,
问题内容: 我研究了一段时间,以查找有关 如何使用PyQT执行多线程程序的 信息 ,并更新了GUI以显示结果 。 我习惯于通过示例学习,但我找不到(是的,我找了好几个星期)使用多线程执行此简单任务的程序的任何简单示例,例如连接到www网站列表(5个线程)并只是打印处理带有响应代码的网址。 任何人都可以共享代码或让我进入解释此类程序的出色教程吗? 问题答案: 这里有一些非常基本的例子。 您可以将对G