谷歌应用引擎中的交易隔离

时间:2013-07-04 16:32:56

标签: google-app-engine google-cloud-datastore

在Google App Engine中,事务隔离被称为SNAPSHOT隔离,您不会在事务本身中看到先前的删除或放置,而只会在事务开始时看到数据存储的状态(https://developers.google.com/appengine/docs/python/datastore/transactions)。在一篇较旧的文章中,它说事务级别实际上是SERIALIZABLE(https://developers.google.com/appengine/articles/transaction_isolation)。

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

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

1 个答案:

答案 0 :(得分: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隔离发生冲突。

SNAPSHOT和SERIALIZABLE都从数据的“快照”中读取,好像数据在事务运行时以与事务隔离保证冲突的方式更改,无法提交事务。