GoogleCloudPlatform / GoogleCloudPlatform/appengine-python-standard

NDB transaction() read_only property does not work

Open
#114 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
86
Forks
61
PR merge metrics
No merged PRs in 30d

Description

## Expected Behavior

The NDB transaction() function has a `read_only` property to indicate that the transaction will only perform entity reads, potentially improving throughput. I expect that it will start a read only transaction when I invoke it as such: `ndb.transaction(txn, read_only=True)`.

## Actual Behavior

Sadly, this flag does not work in the current SDK. Instead, it fails with an `TypeError: Unknown configuration option ('read_only')` error when you specify it (regardless whether it is True of False).

Full stack trace:

```
Traceback (most recent call last):
File "/Users/tijmen/dev/ndb-read-only/readonly_test.py", line 22, in test_readonly_transaction
ndb.transaction(txn, read_only=False) # Does not work
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/tijmen/dev/ndb-read-only/lib/google/appengine/ext/ndb/utils.py", line 182, in positional_wrapper
return wrapped(*args, **kwds)
^^^^^^^^^^^^^^^^^^^^^^
File "/Users/tijmen/dev/ndb-read-only/lib/google/appengine/ext/ndb/model.py", line 3902, in transaction
return fut.get_result()
^^^^^^^^^^^^^^^^
File "/Users/tijmen/dev/ndb-read-only/lib/google/appengine/ext/ndb/tasklets.py", line 397, in get_result
self.check_success()
File "/Users/tijmen/dev/ndb-read-only/lib/google/appengine/ext/ndb/tasklets.py", line 394, in check_success
six.reraise(self._exception.__class__, self._exception, self._traceback)
File "/Users/tijmen/dev/ndb-read-only/lib/six.py", line 719, in reraise
raise value
File "/Users/tijmen/dev/ndb-read-only/lib/google/appengine/ext/ndb/tasklets.py", line 444, in _help_tasklet_along
value = gen.send(val)
^^^^^^^^^^^^^
File "/Users/tijmen/dev/ndb-read-only/lib/google/appengine/ext/ndb/context.py", line 976, in transaction
options = _make_ctx_options(ctx_options, TransactionOptions)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/tijmen/dev/ndb-read-only/lib/google/appengine/ext/ndb/context.py", line 145, in _make_ctx_options
return config_cls(**ctx_options)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/tijmen/dev/ndb-read-only/lib/google/appengine/datastore/datastore_rpc.py", line 392, in __new__
raise TypeError('Unknown configuration option (%s)' % err)
TypeError: Unknown configuration option ('read_only')
```

## Steps to Reproduce the Problem

Run the following test:

```
import unittest
from google.appengine.ext import testbed
from google.appengine.ext import ndb

class ExampleModel(ndb.Model):
pass

class LoggingTest(unittest.TestCase):
def setUp(self):
self.testbed = testbed.Testbed()
self.testbed.setup_env()
self.testbed.activate()
self.testbed.init_memcache_stub()
self.testbed.init_datastore_v3_stub()

def tearDown(self):
self.testbed.deactivate()

def test_readonly_transaction(self):
def txn():
model = ExampleModel.get_by_id("test")
ndb.transaction(txn, read_only=True) # Does not work

def test_normal_transaction(self):
def txn():
model = ExampleModel.get_by_id("test")
ndb.transaction(txn) # Works.

if __name__ == '__main__':
unittest.main()
```

## Specifications

Version: appengine-python-standard 1.1.6

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.