如何让两个相同的读写+并发事务相互等待?

时间:2016-08-11 20:01:25

标签: java database transactions spring-transactions isolation-level

我有一个从数据库中读取的Spring事务,如果找不到它,则会创建它。例如:

Isolation.SERIALIZABLE

如果同时调用此方法两次,则会导致两个不同的用户在数据库中使用相同的电子邮件(对于唯一的电子邮件没有限制,这仅用于说明目的)。

我希望第二个事务等待第一个事务,以便只创建一个用户。我已经尝试将事务隔离级别更改为synchronized但它所做的只是使事务最后一次回滚。

修改 在任何人建议使用$(document).ready(function(){ $("#addFile").click(function() { $("#my_file").click(); }); $("#my_file").change(function(e) { var files = e.target.files; for (var i = 0, f; f = files[i]; i++) { ParseFile(f); } function ParseFile(file) { var filename = file.name.replace(/\..+$/, ''); var filesize = file.size / 1024; filesize = (Math.round((filesize / 1024) * 100) / 100); var filetype = file.type.split('/').pop().toUpperCase(); if (filetype == 'PDF' || filetype == 'JPEG' || filetype == 'JPG' || filetype == 'PNG') { $("#filedetails").append("<tr><td><strong>" + filename + "</strong></td><td>" + filesize + " MB</td><td>" + filetype + "</td><td><a href='#'>Delete</td></tr>"); } else { alert('Only JPG, PDF n PNG files are allowed to upload.'); } } }); });或类似的东西在java中锁定解决方案之前,了解此方法是Web应用程序的一部分并在特定端点被命中时调用是很重要的。 Web应用程序在几台不同的计算机上运行,​​并且负载均衡,并且在同时调用两次端点时会出现问题。这意味着代码可以在两台不同的机器上并行执行,与另一台机器上的同一个DB通信

2 个答案:

答案 0 :(得分:1)

解决了咨询锁:

procedure TgboAmazon.MwsRequest(...; Response: TStream);
var
  ...
begin
  ...
  AHTTP.Post(APath, AStream, Response);
  ...
end;

答案 1 :(得分:0)

您可以使用“锁定”表。它将包含您需要锁定的所有内容,即表名(例如“用户”)和行键(例如“email”)。

如果您需要更快的东西,那么您可以在服务器上使用memcached和复制。如果您的插入不多,那么db解决方案可能会没问题。