我知道在应用引擎上处理数据库事务性的方法是为不同的实体提供相同的Parent
(实体组)并使用db.run_in_transaction
。
但是,假设我不能够为两个实体提供相同的父级。如何确保在事务中进行数据库更新?
有技术解决方案吗?如果没有,是否有我可以应用的模式?
注意:我使用的是Python。
答案 0 :(得分:5)
只要实体属于同一组,这不是问题。来自docs:
a中的所有数据存储区操作 交易必须对实体进行操作 在同一个实体组中。这个 包括查询实体 祖先,按键检索实体, 更新实体和删除 实体。请注意每个根实体 属于一个单独的实体组,所以 单个事务无法创建或 在多个根实体上运行。 有关实体组的解释, 请参阅密钥和实体组。
还有一篇关于Transaction Isolation in App Engine的好文章。
编辑:如果您需要在同一事务中更新具有不同父项的实体,则需要实现一种方法来序列化您自己所做的更改并在发生异常时手动回滚
答案 1 :(得分:3)
如果您想要跨实体组事务,您必须自己实现它们,或者等待库来执行它们。我刚才写了an article关于如何在“银行转账”案例中实施跨实体集团交易的文章;它也可能适用于您的用例。
答案 2 :(得分:2)
AppEngine数据存储区中的事务与您在SQL数据库中可能使用的事务的行为方式不同。首先,事务实际上并没有锁定它正在运行的实体。
Translation Isolation in App Engine文章更详细地解释了这一点。
正因为如此,你会想要对交易有不同的看法 - 你可能会发现,在你想要使用交易的大多数情况下,这是不必要的 - 或者它无法实现你想要的
有关实体组和数据存储模型的详细信息,请参阅How Entities and Indexes are Stored。
Handling Datastore Errors讨论可能导致交易无法提交以及如何处理问题的事情。
答案 3 :(得分:2)
一种可能性是如您所述实现自己的事务处理。如果您正在考虑这样做,那么值得您花时间探索此问题的前期工作。
Dan Wilkerson也在Google IO上发表了演讲。你应该能够找到谈话的视频。答案 4 :(得分:0)
erick armbrust在java中实现了daniel wilkerson的分布式事务设计:http://code.google.com/p/tapioca-orm/