Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
2a570b8
chore: sample for snapshot isolation
alkatrivedi Mar 25, 2025
e73331f
🦉 Updates from OwlBot post-processor
gcf-owl-bot[bot] Mar 25, 2025
f09e627
refactor: sample comments
alkatrivedi Mar 26, 2025
1c03bdf
Merge branch 'main' into sample-snapshot-isolation
alkatrivedi Apr 1, 2025
82eb764
refactor sample
alkatrivedi Apr 1, 2025
470eb56
🦉 Updates from OwlBot post-processor
gcf-owl-bot[bot] Apr 2, 2025
5772cb2
Merge branch 'main' into sample-snapshot-isolation
alkatrivedi Apr 7, 2025
0da8b77
refactor: tests
alkatrivedi Apr 7, 2025
fd1d72f
🦉 Updates from OwlBot post-processor
gcf-owl-bot[bot] Apr 7, 2025
8c56a11
🦉 Updates from OwlBot post-processor
gcf-owl-bot[bot] Apr 7, 2025
33c251e
Merge branch 'sample-snapshot-isolation' of https://github.com/google…
gcf-owl-bot[bot] Apr 7, 2025
aca1a43
Merge branch 'main' into sample-snapshot-isolation
alkatrivedi May 15, 2025
95f7260
🦉 Updates from OwlBot post-processor
gcf-owl-bot[bot] May 15, 2025
09561a5
Merge branch 'main' into sample-snapshot-isolation
alkatrivedi Jun 5, 2025
662f325
Merge branch 'main' into sample-snapshot-isolation
alkatrivedi Jun 7, 2025
371065b
Merge branch 'main' into sample-snapshot-isolation
alkatrivedi Jun 11, 2025
5b8491e
Merge branch 'main' into sample-snapshot-isolation
alkatrivedi Jun 13, 2025
bc22e56
Merge branch 'main' into sample-snapshot-isolation
alkatrivedi Jun 18, 2025
cb84001
Merge branch 'main' into sample-snapshot-isolation
alkatrivedi Jul 4, 2025
e8edcdb
Merge branch 'main' into sample-snapshot-isolation
alkatrivedi Jul 18, 2025
4274d0b
Merge branch 'main' into sample-snapshot-isolation
alkatrivedi Aug 20, 2025
05150e7
Merge branch 'main' into sample-snapshot-isolation
alkatrivedi Aug 25, 2025
14b2fd4
change naming
alkatrivedi Aug 25, 2025
217b0a5
🦉 Updates from OwlBot post-processor
gcf-owl-bot[bot] Aug 25, 2025
000122d
🦉 Updates from OwlBot post-processor
gcf-owl-bot[bot] Aug 25, 2025
0a3d9cb
Merge branch 'sample-snapshot-isolation' of https://github.com/google…
gcf-owl-bot[bot] Aug 25, 2025
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
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ Samples are in the [`samples/`](https://github.com/googleapis/nodejs-spanner/tre
| Queryoptions | [source code](https://github.com/googleapis/nodejs-spanner/blob/main/samples/queryoptions.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-spanner&page=editor&open_in_editor=samples/queryoptions.js,samples/README.md) |
| Quickstart | [source code](https://github.com/googleapis/nodejs-spanner/blob/main/samples/quickstart.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-spanner&page=editor&open_in_editor=samples/quickstart.js,samples/README.md) |
| Read data with database role | [source code](https://github.com/googleapis/nodejs-spanner/blob/main/samples/read-data-with-database-role.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-spanner&page=editor&open_in_editor=samples/read-data-with-database-role.js,samples/README.md) |
| Performs a read-write transaction with isolation level option | [source code](https://github.com/googleapis/nodejs-spanner/blob/main/samples/repeatable-read.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-spanner&page=editor&open_in_editor=samples/repeatable-read.js,samples/README.md) |
| Sets a request tag for a single query | [source code](https://github.com/googleapis/nodejs-spanner/blob/main/samples/request-tag.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-spanner&page=editor&open_in_editor=samples/request-tag.js,samples/README.md) |
| Run Batch update with RPC priority | [source code](https://github.com/googleapis/nodejs-spanner/blob/main/samples/rpc-priority-batch-dml.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-spanner&page=editor&open_in_editor=samples/rpc-priority-batch-dml.js,samples/README.md) |
| Run partitioned update with RPC priority | [source code](https://github.com/googleapis/nodejs-spanner/blob/main/samples/rpc-priority-partitioned-dml.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-spanner&page=editor&open_in_editor=samples/rpc-priority-partitioned-dml.js,samples/README.md) |
Expand Down
18 changes: 18 additions & 0 deletions samples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ and automatic, synchronous replication for high availability.
* [Queryoptions](#queryoptions)
* [Quickstart](#quickstart)
* [Read data with database role](#read-data-with-database-role)
* [Performs a read-write transaction with isolation level option](#performs-a-read-write-transaction-with-isolation-level-option)
* [Sets a request tag for a single query](#sets-a-request-tag-for-a-single-query)
* [Run Batch update with RPC priority](#run-batch-update-with-rpc-priority)
* [Run partitioned update with RPC priority](#run-partitioned-update-with-rpc-priority)
Expand Down Expand Up @@ -1868,6 +1869,23 @@ __Usage:__



### Performs a read-write transaction with isolation level option

View the [source code](https://github.com/googleapis/nodejs-spanner/blob/main/samples/repeatable-read.js).

[![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-spanner&page=editor&open_in_editor=samples/repeatable-read.js,samples/README.md)

__Usage:__


`node snapshot-isolation.js <INSTANCE_ID> <DATABASE_ID> <PROJECT_ID>`


-----




### Sets a request tag for a single query

View the [source code](https://github.com/googleapis/nodejs-spanner/blob/main/samples/request-tag.js).
Expand Down
98 changes: 98 additions & 0 deletions samples/repeatable-read.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// sample-metadata:
// title: Performs a read-write transaction with isolation level option
// usage: node snapshot-isolation.js <INSTANCE_ID> <DATABASE_ID> <PROJECT_ID>

'use strict';

function main(
instanceId = 'my-instance',
databaseId = 'my-database',
projectId = 'my-project-id'
) {
// [START spanner_isolation_level]
// Imports the Google Cloud Spanner client library
const {Spanner, protos} = require('@google-cloud/spanner');
// The isolation level specified at the client-level will be applied
// to all RW transactions.
const isolationOptionsForClient = {
defaultTransactionOptions: {
isolationLevel:
protos.google.spanner.v1.TransactionOptions.IsolationLevel.SERIALIZABLE,
},
};

// Instantiates a client with defaultTransactionOptions
const spanner = new Spanner({
projectId: projectId,
defaultTransactionOptions: isolationOptionsForClient,
});

function runTransactionWithIsolationLevel() {
// Gets a reference to a Cloud Spanner instance and database
const instance = spanner.instance(instanceId);
const database = instance.database(databaseId);
// The isolation level specified at the request level takes precedence over the isolation level configured at the client level.
const isolationOptionsForTransaction = {
isolationLevel:
protos.google.spanner.v1.TransactionOptions.IsolationLevel
.REPEATABLE_READ,
};

database.runTransaction(
isolationOptionsForTransaction,
async (err, transaction) => {
if (err) {
console.error(err);
return;
}
try {
const query =
'SELECT AlbumTitle FROM Albums WHERE SingerId = 1 AND AlbumId = 1';
const results = await transaction.run(query);
// Gets first album's title
const rows = results[0].map(row => row.toJSON());
const albumTitle = rows[0].AlbumTitle;
console.log(`previous album title ${albumTitle}`);

const update =
"UPDATE Albums SET AlbumTitle = 'New Album Title' WHERE SingerId = 1 AND AlbumId = 1";
const [rowCount] = await transaction.runUpdate(update);
console.log(
`Successfully updated ${rowCount} record in Albums table.`
);
await transaction.commit();
console.log(
'Successfully executed read-write transaction with isolationLevel option.'
);
} catch (err) {
console.error('ERROR:', err);
} finally {
transaction.end();
// Close the database when finished.
await database.close();
}
}
);
}
runTransactionWithIsolationLevel();
// [END spanner_isolation_level]
}
process.on('unhandledRejection', err => {
console.error(err.message);
process.exitCode = 1;
});
main(...process.argv.slice(2));
18 changes: 18 additions & 0 deletions samples/system-test/spanner.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -675,6 +675,24 @@ describe('Autogenerated Admin Clients', () => {
);
});

// isolation_level_option
it('should run read-write transaction with isolation level option set', () => {
const output = execSync(
`node snapshot-isolation.js ${INSTANCE_ID} ${DATABASE_ID} ${PROJECT_ID}`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here with naming.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

);
console.log(output);
assert.match(
output,
new RegExp('Successfully updated 1 record into the Singers table.')
);
assert.match(
output,
new RegExp(
'Successfully executed read-write transaction with isolationLevel option.'
)
);
});

// query with RPC priority for run command
it('should use RPC priority from request options for run command', async () => {
const output = execSync(
Expand Down
Loading