Skip to content

feat: support read lock mode for R/W transactions #4010

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

shobhitsg
Copy link
Contributor

Samples and integration tests will be added in separate PRs.

@shobhitsg shobhitsg requested review from a team as code owners August 5, 2025 09:25
@product-auto-label product-auto-label bot added size: l Pull request size is large. api: spanner Issues related to the googleapis/java-spanner API. labels Aug 5, 2025
sakthivelmanii
sakthivelmanii previously approved these changes Aug 6, 2025
@sakthivelmanii sakthivelmanii added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Aug 6, 2025
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Aug 6, 2025
*
* <ul>
* <li>{@link ReadLockMode#PESSIMISTIC}: Read locks are acquired immediately on read. This mode
* primarily applies to transactions with {@code SERIALIZABLE} isolation.
Copy link
Collaborator

Choose a reason for hiding this comment

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

What does this sentence mean?

This mode primarily applies to transactions with {@code SERIALIZABLE} isolation.

That it has no effect on RR? Or that it has a strong effect on Serializable?

What I'm aiming at is: Can we make this more concrete? As a customer, I would have no idea what this means.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I've updated the doc. Currently, we do not allow setting the readLockMode for Repeatable Read(RR) isolation level and error will be returned. And by default, OPTIMISTIC lock mode will be used for RR.

/**
* Returns a {@link TransactionOption} to set the desired {@link ReadLockMode} for a read-write
* transaction.
*
Copy link
Collaborator

Choose a reason for hiding this comment

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

Can we also add some generic advice when to use what? (Otherwise, I think that most users will automatically assume that 'optimistic is always better than pessimistic').

So for example something like this:

Suggested change
*
* Optimistic locking can improve throughput, as transactions wait with taking locks until they try to commit,
* but increases the probability that Spanner needs to abort a transaction due to lock conflicts. Pessimistic
* locking instructs transactions to take locks earlier, which means that concurrent transactions might have
* to wait for other transactions to release locks before proceeding. Pessimistic locking reduces the probability
* that Spanner needs to abort a transaction due to lock conflicts.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I initially added some advice to the document but removed it because I felt it deserved a more detailed explanation in a separate link. I've now added the advice back, and we will update this document once the RR + Pessimistic feature is launched.

@shobhitsg
Copy link
Contributor Author

@sakthivelmanii @olavloite: I've addressed the review comments. PTAL.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api: spanner Issues related to the googleapis/java-spanner API. size: l Pull request size is large.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants