def test_retry_transaction_w_commit_error_txn_already_begun(self): from google.gax.errors import GaxError from google.cloud.spanner.transaction import Transaction TABLE_NAME = 'citizens' COLUMNS = ['email', 'first_name', 'last_name', 'age'] VALUES = [ ['*****@*****.**', 'Phred', 'Phlyntstone', 32], ['*****@*****.**', 'Bharney', 'Rhubble', 31], ] gax_api = _SpannerApi( _commit_error=True, ) database = _Database(self.DATABASE_NAME) database.spanner_api = gax_api session = self._make_one(database) session._session_id = 'DEADBEEF' begun_txn = session._transaction = Transaction(session) begun_txn._id = b'FACEDACE' called_with = [] def unit_of_work(txn, *args, **kw): called_with.append((txn, args, kw)) txn.insert(TABLE_NAME, COLUMNS, VALUES) with self.assertRaises(GaxError): session.run_in_transaction(unit_of_work) self.assertEqual(len(called_with), 1) txn, args, kw = called_with[0] self.assertIs(txn, begun_txn) self.assertEqual(txn.committed, None) self.assertEqual(args, ()) self.assertEqual(kw, {})
def transaction(self): """Create a transaction to perform a set of reads with shared staleness. :rtype: :class:`~google.cloud.spanner.transaction.Transaction` :returns: a transaction bound to this session :raises: :exc:`ValueError` if the session has not yet been created. """ if self._session_id is None: raise ValueError("Session has not been created.") if self._transaction is not None: self._transaction._rolled_back = True txn = self._transaction = Transaction(self) return txn