Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Spanner/src/Operation.php
Original file line number Diff line number Diff line change
Expand Up @@ -736,7 +736,7 @@ public function transaction(SessionCache $session, array $options = []): Transac
'requestOptions' => $beginTransaction->getRequestOptions(),
'transactionOptions' => $txnOptions,
]);
return new Transaction(
$transaction = new Transaction(
$this,
$session,
$id,
Expand Down
3 changes: 3 additions & 0 deletions Spanner/src/Transaction.php
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,9 @@ public function commit(array $options = []): Timestamp
$transaction = $this->operation->transaction($this->session, $operationTransactionOptions);
// Set the transaction ID of the current transaction.
$this->transactionId = $transaction->id();
if (isset($transaction->precommitToken)) {
$this->setPrecommitToken($transaction->precommitToken);
}
}

if (!$this->singleUseState()) {
Expand Down
24 changes: 24 additions & 0 deletions Spanner/tests/Unit/OperationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,30 @@ public function testTransactionWithExcludeTxnFromChangeStreams()
$this->assertEquals('foo', $transaction->id());
}

public function testTransactionWithPrecommitToken()
{
$precommitToken = new MultiplexedSessionPrecommitToken([
'precommit_token' => 'my-precommit-token',
]);
$this->spannerClient->beginTransaction(
Argument::cetera()
)
->shouldBeCalled()
->willReturn(new TransactionProto([
'id' => self::TRANSACTION,
'precommit_token' => $precommitToken,
]));

$t = $this->operation->transaction($this->session);
$this->assertInstanceOf(Transaction::class, $t);
$this->assertEquals(self::TRANSACTION, $t->id());

$ref = new \ReflectionClass(Transaction::class);
$prop = $ref->getProperty('precommitToken');
$this->assertNotNull($prop->getValue($t));
$this->assertEquals($precommitToken, $prop->getValue($t));
}

public function testExecuteAndExecuteUpdateWithExcludeTxnFromChangeStreams()
{
$sql = 'SELECT example FROM sql_query';
Expand Down
51 changes: 51 additions & 0 deletions Spanner/tests/Unit/TransactionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -620,6 +620,57 @@ public function testCommitWithMaxCommitDelay()
$this->assertEquals(1, $transaction->getCommitStats()->getMutationCount());
}

public function testCommitSetsPrecommitTokenFromInlineBegin()
{
$precommitToken = new MultiplexedSessionPrecommitToken([
'precommit_token' => 'my-precommit-token',
]);

$operation = $this->prophesize(Operation::class);

// Create the transaction returned by Operation::transaction()
$returnedTransaction = new Transaction(
$operation->reveal(),
$this->session->reveal(),
self::TRANSACTION,
[]
);
$returnedTransaction->setPrecommitToken($precommitToken);

$operation->transaction($this->session->reveal(), Argument::any())
->shouldBeCalled()
->willReturn($returnedTransaction);

// Verify that commit() receives the precommit token in options
$operation->commit(
$this->session->reveal(),
Argument::any(),
Argument::that(function ($options) use ($precommitToken) {
$this->assertArrayHasKey('precommitToken', $options);
$this->assertEquals($precommitToken, $options['precommitToken']);
return true;
})
)
->shouldBeCalled()
->willReturn($this->commitResponseWithCommitStats());

$transaction = new Transaction(
$operation->reveal(),
$this->session->reveal(),
null, // Null transaction ID to trigger inline begin
[
'begin' => ['readWrite' => []]
]
);

$transaction->insert('Posts', ['foo' => 'bar']);
$transaction->commit();

$ref = new \ReflectionClass(Transaction::class);
$prop = $ref->getProperty('precommitToken');
$this->assertNull($prop->getValue($transaction));
}

public function testCommitInvalidState()
{
$this->expectException(\BadMethodCallException::class);
Expand Down
Loading