如何确保数据库事务只发生一次?

How to make sure that DB transaction happens only one time?

如何确保特定的数据库事务只发生一次。我正在通过我的手机发出付款请求(不止一次),但后端应该只执行一个。执行请求后,其状态将标记为已完成。但是在多个请求的情况下,在一个请求完成之前另一个开始执行,所以在状态被标记为 COMPLETED 之前支付完成了两次。如何解决这个问题呢?我正在使用 Java 作为后端。 synchronize() 如何帮助解决这个问题?

您可以尝试在代码周围加一把锁。这样在任何给定时间只有一个线程可以进入。 如果你提出一个请求,那么另一个请求必须等到请求完成。

这是一个已知问题,称为 Double Post。

使用 Synchronize 和 lock 阻止对方法的并行访问对您没有帮助,因为请求将按顺序进行。

使用客户端方法可能有所帮助,但还不够,因为很多事情可能发生在客户端。

如果你想在服务器端阻止它(这是正确的做法),你可以在客户端表单中添加一个隐藏字段(一些唯一的哈希字符串)并在每次请求时将其发送到服务器。在服务器端组件中,您可以检查是否已收到具有该哈希值的请求,如果收到,return 向客户端发送错误代码。

您还可以将散列值与您的数据保持一致,并使其成为一个唯一字段,这样到达您数据库的第一个请求将被保留,而其他请求将看到唯一字段错误。