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

Nav*_*han 9 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?

Alf*_*ler 3

您可以在 BeginTransaction API 参考中了解如何更改隔离级别。目前只能在 Google Cloud Datastore HTTP API 中进行配置,并且对于所有 App Engine SDK,它默认为 SERIALIZABLE。但我不认为这会做你想做的事。

SNAPSHOT 与 SERIALIZABLE 控制事务隔离或并发事务如何相互交互。它不控制事务如何与其自身交互(尽管在某些系统中这两件事被混为一谈)。

在数据存储中,设置 SERIALIZABLE 不会使事务看到其自己的未提交的突变。这仅意味着如果并发事务的读写模式在序列化时无效,则并发事务将会发生冲突。例如,使用 SERIALIZABLE 隔离时,以下两个事务必然会发生冲突:

TX1: READ A, WRITE B'
TX2: READ B, WRITE A'
Run Code Online (Sandbox Code Playgroud)

由于这两种排序都不可能:

READ A, WRITE B', READ B (conflict), WRITE A'
READ B, WRITE A', READ A (conflict), WRITE B'
Run Code Online (Sandbox Code Playgroud)

但是,这些事务不一定会与 SNAPSHOT 隔离发生冲突。

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