GAE对CloudSQL的悲观锁定

时间:2014-01-24 13:21:37

标签: spring google-app-engine java-ee google-cloud-sql database-concurrency

有没有人试图在GAE上实施悲观锁定?在我的项目中,有些任务必须互相排斥。我这样做是通过使用:

javax.persistence.EntityManager.find(entityClass, primaryKey, LockModeType.PESSIMISTIC_READ);

使用SELECT FOR UPDATE查询数据库并且运行良好...只要只有一个应用程序实例正在处理请求。如果有更多实例,我的请求将部分同时处理。

我已经通过在我的互斥方法中添加了10秒的睡眠来测试它。例如,有6个请求在大约60秒内处理,但有3个实例有时20个,有时30个,但从不60秒。

是否意味着CloudSQL不会在SQL实例中复制锁定?有没有其他方法可以在表行上实现悲观锁定?

溴 马立克

1 个答案:

答案 0 :(得分:1)

实际上,您似乎是指CloudSQL服务器实例,而不是AppEngine SQL客户端实例。 CloudSQL是基于MySQL的,并且MySQL锁的范围确实仅限于单个服务器实例。复制复制SQL数据,但不复制会话或锁。因此,您的测量结果很有意义。

它可能不适合您,但您可以将CloudSQL实例的数量保持为1,但会增加AppEngine服务器实例的数量,这将是CloudSQL客户端。希望在不牺牲一致性(悲观锁定)的情况下提供一些可扩展性。你的困境是CAP定理的必然表现。