Skip to content

Commit 1551e28

Browse files
committed
chore: snapshot isolation sample
1 parent af8e973 commit 1551e28

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

samples/samples/snippets.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3175,6 +3175,42 @@ def directed_read_options(
31753175
print("SingerId: {}, AlbumId: {}, AlbumTitle: {}".format(*row))
31763176
# [END spanner_directed_read]
31773177

3178+
def isolation_level_options(
3179+
instance_id,
3180+
database_id,
3181+
):
3182+
from google.cloud.spanner_v1 import TransactionOptions, DefaultTransactionOptions
3183+
3184+
"""
3185+
Shows how to run a Read Write transaction with isolation level options.
3186+
"""
3187+
# [START spanner_isolation_level]
3188+
# instance_id = "your-spanner-instance"
3189+
# database_id = "your-spanner-db-id"
3190+
3191+
isolation_level_options_for_client = TransactionOptions.IsolationLevel.SERIALIZABLE
3192+
3193+
# The isolation level specified at the client level via default_transaction_options will be applied to all RW transactions
3194+
spanner_client = spanner.Client(
3195+
default_transaction_options=DefaultTransactionOptions(isolation_level=isolation_level_options_for_client)
3196+
)
3197+
instance = spanner_client.instance(instance_id)
3198+
database = instance.database(database_id)
3199+
3200+
isolation_level_options_for_request = TransactionOptions.IsolationLevel.REPEATABLE_READ
3201+
3202+
def insert_singers(transaction):
3203+
row_ct = transaction.execute_update(
3204+
"INSERT INTO Singers (SingerId, FirstName, LastName) "
3205+
" VALUES (20, 'Virginia', 'Watson')"
3206+
)
3207+
3208+
print("{} record(s) inserted.".format(row_ct))
3209+
3210+
# The isolation level specified at the request level takes precedence over the isolation level configured at the client level.
3211+
database.run_in_transaction(insert_singers, isolation_level=isolation_level_options_for_request)
3212+
# [END spanner_isolation_level]
3213+
31783214

31793215
def set_custom_timeout_and_retry(instance_id, database_id):
31803216
"""Executes a snapshot read with custom timeout and retry."""
@@ -3798,6 +3834,7 @@ def add_split_points(instance_id, database_id):
37983834
)
37993835
enable_fine_grained_access_parser.add_argument("--title", default="condition title")
38003836
subparsers.add_parser("directed_read_options", help=directed_read_options.__doc__)
3837+
subparsers.add_parser("isolation_level_options", help=isolation_level_options.__doc__)
38013838
subparsers.add_parser(
38023839
"set_custom_timeout_and_retry", help=set_custom_timeout_and_retry.__doc__
38033840
)
@@ -3958,6 +3995,8 @@ def add_split_points(instance_id, database_id):
39583995
)
39593996
elif args.command == "directed_read_options":
39603997
directed_read_options(args.instance_id, args.database_id)
3998+
elif args.command == "isolation_level_options":
3999+
isolation_level_options(args.instance_id, args.database_id)
39614000
elif args.command == "set_custom_timeout_and_retry":
39624001
set_custom_timeout_and_retry(args.instance_id, args.database_id)
39634002
elif args.command == "create_instance_with_autoscaling_config":

samples/samples/snippets_test.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -982,7 +982,11 @@ def test_directed_read_options(capsys, instance_id, sample_database):
982982
snippets.directed_read_options(instance_id, sample_database.database_id)
983983
out, _ = capsys.readouterr()
984984
assert "SingerId: 1, AlbumId: 1, AlbumTitle: Total Junk" in out
985-
985+
986+
def test_isolated_level_options(capsys, instance_id, sample_database):
987+
snippets.isolation_level_options(instance_id, sample_database.database_id)
988+
out, _ = capsys.readouterr()
989+
assert "1 record(s) inserted." in out
986990

987991
@pytest.mark.dependency(depends=["insert_data"])
988992
def test_set_custom_timeout_and_retry(capsys, instance_id, sample_database):

0 commit comments

Comments
 (0)