Java 如何确保DB事务只发生一次?

Java 如何确保DB事务只发生一次?,java,database,transactions,Java,Database,Transactions,如何确保特定DB事务只发生一次。我正在从我的手机发出付款请求(不止一次),但后端应该只执行一次。执行请求后,其状态将标记为已完成。但在多个请求的情况下,在一个请求完成之前,另一个请求开始执行,因此在标记为完成的状态之前,支付完成两次。如何解决这个问题?我使用Java作为后端。synchronize()如何帮助解决此问题?您可以尝试在代码周围添加锁。这样,在任何给定的时间只有一个线程可以进入。 如果您提出一个请求,那么另一个请求必须等到请求完成。这是一个众所周知的问题,称为“双重发布” 阻止使用S

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

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

这是一个众所周知的问题,称为“双重发布”

阻止使用Synchronize和lock并行访问该方法对您没有帮助,因为请求将以串行方式进行

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

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


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

您可以输入一些您尝试过的代码吗?在Tomcat上执行的两个线程通常不会相互了解。因此,他们也不知道对方是否正在尝试相同的事务。这就是为什么许多电子商务网站警告您不要多次按submit。一旦AJAX调用完成,立即将submit按钮灰显。如果一个恶意用户绕过了这个,那么让他们订购更多你的东西。这是一个JEE应用程序吗?