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

时间:2016-04-21 10:49:30

标签: java database transactions

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这是Double Post的已知问题。

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

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

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

您还可以将哈希值与数据一起保留并使其成为唯一字段,因此第一个到达数据库的请求将被保留,其他请求将会看到唯一的字段错误。