java中的并发请求处理

时间:2016-02-03 10:48:52

标签: concurrency

在我们的应用程序中,如果用户以admin身份登录,他可以执行任何操作。假设一个管理员修改路线,如果第二个管理员同时检查相同的路线并为同一路线创建空运提单。这将是一个问题。我找不到我的应用程序如何处理这些并发请求。 (我们只是使用jdbc事务)

我从我的团队得到不同的答案1.网络/应用程序服务器处理这些事务,它将处理并发请求而没有任何问题。 2.锁将发生在数据库的行上,对于并发请求不会有任何问题。

底线:并发请求应该在代码中处理?或者我们将在部署时在Web /应用程序中为并发请求进行任何设置?或者默认情况下数据库将通过行锁定机制处理并发请求?

如果有人知道在哪里找到解决方案,请告诉我。

2 个答案:

答案 0 :(得分:0)

据我所知,大多数数据库引擎在查询期间使用某种锁定,但它会因引擎而异。我知道InnoDB强制执行事务原子性(see this stack exchange thread),因此事务中的任何事情都不会受到中间执行的干扰。但是,没有任何关于哪个请求将首先到达数据库的保证。

对于webServer / appServer,假设您使用线程Web服务器:apache tomcat,jetty等,然后每个请求都由一个单独的线程处理,所以我认为没有固有的线程安全。在大多数情况下,数据库将处理您的并发而不会抱怨,但是我建议在应用程序端包含某种序列化,以防您决定在某个地方更改数据库实现,您还可以更好地控制请求的方式处理完毕。

简而言之......两者都做。

答案 1 :(得分:0)

据我所知,大多数数据库在事务和查询期间都有某种锁定,但是您应该检查数据库引用以确保它使用的锁定方法的类型。至于你的web服务器的问题,我知道tomcat会同时处理请求并为它自己的资源提供某种线程安全性,但它不会为你的应用程序提供线程安全性。因此,你应该自己动手。对于上面提到的问题,我认为当您访问路由时,您应该根据数据库查询它是否存在。此外,当您的其他管理员正在修改路由时,您可以对正在执行此操作的块使用某种锁定,以便当其他管理员同时想要访问正在修改的路由时,他会等待事务处理完成。如果您在服务器端使用java,我建议您查看java同步方法或其他语言,检查该语言的锁定和线程安全方法。