1

有没有人尝试在 GAE 上实现悲观锁定?在我的项目中,有些任务必须是相互排斥的。我已经通过使用:

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

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

我已经通过在我的互斥方法中添加 10 秒的睡眠来对此进行测试。对于一个实例,在大约 60 秒内处理了 6 个请求,但对于 3 个实例,有时是 20 个,有时是 30 个,但从来没有 60 秒。

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

布雷马雷克

4

1 回答 1

1

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

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

于 2014-01-24T14:43:01.680 回答