0

我正在为医疗通道中心开发一个应用程序,多个用户使用 JSF 和 JPA 为医生预订预约。序列号对于医生、日期和会话是唯一的。我试图从计算先前的预订中获得一个唯一的序列号并添加一个,但如果同时出现两个请求,则两个预订会获得相同的编号,从而导致功能出现问题。在这种情况下如何获得唯一编号?我可以使用应用程序范围的 bean 来生成它吗?(我认为从数据库序列号中获取唯一编号是不切实际的,因为有几个医生、会话和每天他们必须有不同的预订号。)

4

2 回答 2

1

这是我的做法:

在数据库中有一个包含 6 列的表:

  • id(自动生成的主键)
  • 医生编号
  • 日期
  • 会议
  • 柜台
  • 版本(映射到带有注释的字段@Version,用于乐观锁定)

确保在 [doctorId, date, session] 上添加一个唯一的约束。

创建一个服务,在它自己的事务中运行(REQUIRES_NEW 传播),调用

 getNextValue(doctorId, date, session)

该服务应从数据库表中获取与其三个参数相对应的计数器,将其返回并递增。如果还没有行,它应该创建它。

仍然有可能让两个并发事务尝试同时创建或增加同一行。在创建的情况下,由于唯一约束,其中一个事务将回滚。在增量的情况下,由于 JPA 乐观锁定,其中一个事务将回滚。

如果服务回滚,则重试,直到不再有异常。

这避免了将所有这些计数器存储在内存中,是无状态的,因此如果您重新启动应用程序不会导致任何问题,并且即使您有一个服务器集群也可以工作。

于 2012-11-16T10:57:39.077 回答
0

这是在数据库中使用序列的完美案例。

您应该在 DB 表中创建 ID,并确保该字段是通过序列自动生成的,然后您无需担心两行使用相同的值。

于 2012-11-16T11:02:09.847 回答