EJB/JPA中的并发事务管理
我正在EJB3.0上工作,在EJB3.0中,实体bean由JPA管理。我的问题是,如果两个或多个用户同时尝试使用相同的表单插入同一个表,JPA将如何处理这种情况。它将通过使用数据库事务很好地管理它。如果两个线程试图同时创建同一行(即使用相同的主键),其中一个将成功,另一个将从数据库中获取异常,这将导致其事务回滚。这意味着在同一事务中进行的所有其他插入、更新和删除也将被回滚,或者如果愿意,将被取消,从而使数据库保持一致状态。这是我最喜欢的EJB/JPA中的并发事务管理,jpa,ejb,Jpa,Ejb,我正在EJB3.0上工作,在EJB3.0中,实体bean由JPA管理。我的问题是,如果两个或多个用户同时尝试使用相同的表单插入同一个表,JPA将如何处理这种情况。它将通过使用数据库事务很好地管理它。如果两个线程试图同时创建同一行(即使用相同的主键),其中一个将成功,另一个将从数据库中获取异常,这将导致其事务回滚。这意味着在同一事务中进行的所有其他插入、更新和删除也将被回滚,或者如果愿意,将被取消,从而使数据库保持一致状态。这是我最喜欢的 如果两个线程在同一个表中同时插入两个不同的行,那么数据库将
如果两个线程在同一个表中同时插入两个不同的行,那么数据库将很好地处理这一问题,并且两行都将被插入 表的主键是什么?主键是由序列或复合业务键自动生成的还是什么?如果密钥是自动生成的,并发插入通常不需要JPA执行任何特殊操作。主键是oracle的序列。但我好奇的是,如果它不是自动生成的,而是作为主键的单个varchar列,JPA将如何管理,或者它将如何管理序列。“怎么做”?好吧,我明白你的意思。每当一个新实体变得持久时,序列预分配器将预生成密钥并将其分配给您的实体。序列如何工作的细节与您的问题无关。若键是单个varchar列,则底层DB将保证不会有具有相同键的重复项@JB Nizet已经解释过,这是ACID的一部分,而且ACID由底层DB而不是JPA保证。