2013-07-04 33 views
9

在Google App Engine中,事务隔离被称为SNAPSHOT隔离,其中您没有看到先前的删除或放入事务本身,但仅在事务开始时才存在数据存储区的状态(https://developers.google.com/appengine/docs/python/datastore/transactions )。在一篇较早的文章中,它表示事务级别实际上是SERIALIZABLE(https://developers.google.com/appengine/articles/transaction_isolation)。谷歌应用程序引擎中的事务隔离

谷歌测试兼容性工具包(TCK)显示它确实是SNAPSHOT隔离,但在上述文章中它说“内部事务,另一方面,隔离级别默认为SNAPSHOT,可选择更改为SERIALIZABLE”。

我的问题是,如何使隔离级别变为SERIALIZABLE?

+1

好问题,甚至没有记录 –

+0

GAE文档中没有记录什么东西?令人震惊的。至少如果GAE团队成员回答这个问题,那么有人可以通过Google搜索找到它。 –

+0

@RomanLevin我根本没有发现它令人震惊... btw从接受的答案中的数据存储区API参考链接停止工作(不令人震惊) – themihai

回答

3

您可以看到如何更改BeginTransaction API Reference中的隔离级别。目前它只能在Google Cloud Datastore HTTP API中配置,并且默认为所有App Engine SDK的SERIALIZABLE。不过,我认为这不会做你想做的事情。

SNAPSHOT vs SERIALIZABLE控制事务隔离或并发事务如何相互交互。它并不控制事务与自身的交互方式(尽管在某些系统中这两个事物是混合的)。

在数据存储区中,设置SERIALIZABLE不会使其成为事务将看到自己未提交的突变。这只意味着如果并发事务在串行化时读写模式无效,它们将发生冲突。例如,下面的两笔交易将使用SERIALIZABLE隔离时一定碰撞:

TX1: READ A, WRITE B' 
TX2: READ B, WRITE A' 

既不这两种排序中是可能的:

READ A, WRITE B', READ B (conflict), WRITE A' 
READ B, WRITE A', READ A (conflict), WRITE B' 

然而,这些交易并不一定会使用快照隔离时发生碰撞。

SNAPSHOT和SERIALIZABLE均从数据的“快照”中读取,就好像数据在事务运行时与事务隔离保证冲突的方式发生更改,事务不能提交。