def commit(self, return_commit_stats=False, request_options=None): """Commit mutations to the database. :type return_commit_stats: bool :param return_commit_stats: If true, the response will return commit stats which can be accessed though commit_stats. :type request_options: :class:`google.cloud.spanner_v1.types.RequestOptions` :param request_options: (Optional) Common options for this request. If a dict is provided, it must be of the same form as the protobuf message :class:`~google.cloud.spanner_v1.types.RequestOptions`. :rtype: datetime :returns: timestamp of the committed changes. :raises ValueError: if there are no mutations to commit. """ self._check_state() database = self._session._database api = database.spanner_api metadata = _metadata_with_prefix(database.name) trace_attributes = {"num_mutations": len(self._mutations)} if request_options is None: request_options = RequestOptions() elif type(request_options) == dict: request_options = RequestOptions(request_options) if self.transaction_tag is not None: request_options.transaction_tag = self.transaction_tag # Request tags are not supported for commit requests. request_options.request_tag = None request = CommitRequest( session=self._session.name, mutations=self._mutations, transaction_id=self._transaction_id, return_commit_stats=return_commit_stats, request_options=request_options, ) with trace_call("CloudSpanner.Commit", self._session, trace_attributes): response = api.commit( request=request, metadata=metadata, ) self.committed = response.commit_timestamp if return_commit_stats: self.commit_stats = response.commit_stats del self._session._transaction return self.committed
def _commit_helper(self, mutate=True, return_commit_stats=False, request_options=None): import datetime from google.cloud.spanner_v1 import CommitResponse from google.cloud.spanner_v1.keyset import KeySet from google.cloud._helpers import UTC now = datetime.datetime.utcnow().replace(tzinfo=UTC) keys = [[0], [1], [2]] keyset = KeySet(keys=keys) response = CommitResponse(commit_timestamp=now) if return_commit_stats: response.commit_stats.mutation_count = 4 database = _Database() api = database.spanner_api = _FauxSpannerAPI(_commit_response=response) session = _Session(database) transaction = self._make_one(session) transaction._transaction_id = self.TRANSACTION_ID transaction.transaction_tag = self.TRANSACTION_TAG if mutate: transaction.delete(TABLE_NAME, keyset) transaction.commit(return_commit_stats=return_commit_stats, request_options=request_options) self.assertEqual(transaction.committed, now) self.assertIsNone(session._transaction) session_id, mutations, txn_id, actual_request_options, metadata = api._committed if request_options is None: expected_request_options = RequestOptions( transaction_tag=self.TRANSACTION_TAG) elif type(request_options) == dict: expected_request_options = RequestOptions(request_options) expected_request_options.transaction_tag = self.TRANSACTION_TAG expected_request_options.request_tag = None else: expected_request_options = request_options expected_request_options.transaction_tag = self.TRANSACTION_TAG expected_request_options.request_tag = None self.assertEqual(session_id, session.name) self.assertEqual(txn_id, self.TRANSACTION_ID) self.assertEqual(mutations, transaction._mutations) self.assertEqual(metadata, [("google-cloud-resource-prefix", database.name)]) self.assertEqual(actual_request_options, expected_request_options) if return_commit_stats: self.assertEqual(transaction.commit_stats.mutation_count, 4) self.assertSpanAttributes( "CloudSpanner.Commit", attributes=dict( TestTransaction.BASE_ATTRIBUTES, num_mutations=len(transaction._mutations), ), )