@InternalApi public interface Connection extends AutoCloseable
A connection to a Cloud Spanner database. Connections are not designed to be thread-safe. The
only exception is the cancel()
method that may be called by any other thread
to stop the execution of the current statement on the connection.
All -Async methods on Connection
are guaranteed to be executed in the order that they
are issued on the Connection
. Mixing synchronous and asynchronous method calls is also
supported, and these are also guaranteed to be executed in the order that they are issued.
Connections accept a number of additional SQL statements for setting or changing the state of
a Connection
. These statements can only be executed using the execute(Statement)
method:
SHOW AUTOCOMMIT
: Returns the current value of AUTOCOMMIT
of this
connection as a ResultSet
SET AUTOCOMMIT=TRUE|FALSE
: Sets the value of AUTOCOMMIT
for this
connection
SHOW READONLY
: Returns the current value of READONLY
of this
connection as a ResultSet
SET READONLY=TRUE|FALSE
: Sets the value of READONLY
for this
connection
SHOW RETRY_ABORTS_INTERNALLY
: Returns the current value of
RETRY_ABORTS_INTERNALLY
of this connection as a ResultSet
SET RETRY_ABORTS_INTERNALLY=TRUE|FALSE
: Sets the value of
RETRY_ABORTS_INTERNALLY
for this connection
SHOW AUTOCOMMIT_DML_MODE
: Returns the current value of
AUTOCOMMIT_DML_MODE
of this connection as a ResultSet
SET AUTOCOMMIT_DML_MODE='TRANSACTIONAL' | 'PARTITIONED_NON_ATOMIC'
: Sets the
value of AUTOCOMMIT_DML_MODE
for this connection
SHOW STATEMENT_TIMEOUT
: Returns the current value of STATEMENT_TIMEOUT
of this connection as a ResultSet
SET STATEMENT_TIMEOUT='<int64>s|ms|us|ns' | NULL
: Sets the value of
STATEMENT_TIMEOUT
for this connection. The supported TimeUnit
s are:
SHOW READ_TIMESTAMP
: Returns the last READ_TIMESTAMP
of this
connection as a ResultSet
SHOW COMMIT_TIMESTAMP
: Returns the last COMMIT_TIMESTAMP
of this
connection as a ResultSet
SHOW READ_ONLY_STALENESS
: Returns the current value of
READ_ONLY_STALENESS
of this connection as a ResultSet
SET READ_ONLY_STALENESS='STRONG' | 'MIN_READ_TIMESTAMP <timestamp>' | 'READ_TIMESTAMP <timestamp>' | 'MAX_STALENESS <int64>s|ms|mus|ns' | 'EXACT_STALENESS (<int64>s|ms|mus|ns)'
: Sets the value of READ_ONLY_STALENESS
for this connection.
SHOW OPTIMIZER_VERSION
: Returns the current value of
OPTIMIZER_VERSION
of this connection as a ResultSet
SET OPTIMIZER_VERSION='<version>' | 'LATEST'
: Sets the value of OPTIMIZER_VERSION
for this connection.
SHOW OPTIMIZER_STATISTICS_PACKAGE
: Returns the current value of
OPTIMIZER_STATISTICS_PACKAGE
of this connection as a ResultSet
SET OPTIMIZER_STATISTICS_PACKAGE='<package>' | ''
: Sets the value of OPTIMIZER_STATISTICS_PACKAGE
for this connection.
BEGIN [TRANSACTION]
: Begins a new transaction. This statement is optional when
the connection is not in autocommit mode, as a new transaction will automatically be
started when a query or update statement is issued. In autocommit mode, this statement will
temporarily put the connection in transactional mode, and return the connection to
autocommit mode when COMMIT [TRANSACTION]
or ROLLBACK [TRANSACTION]
is executed
COMMIT [TRANSACTION]
: Commits the current transaction
ROLLBACK [TRANSACTION]
: Rollbacks the current transaction
SET TRANSACTION READ ONLY|READ WRITE
: Sets the type for the current
transaction. May only be executed before a transaction is actually running (i.e. before any
statements have been executed in the transaction)
START BATCH DDL
: Starts a batch of DDL statements. May only be executed when
no transaction has been started and the connection is in read/write mode. The connection
will only accept DDL statements while a DDL batch is active.
START BATCH DML
: Starts a batch of DML statements. May only be executed when
the connection is in read/write mode. The connection will only accept DML statements while
a DML batch is active.
RUN BATCH
: Ends the current batch, sends the batched DML or DDL statements to
Spanner and blocks until all statements have been executed or an error occurs. May only be
executed when a (possibly empty) batch is active. The statement will return the update
counts of the batched statements as ResultSet
with an ARRAY<INT64> column. In
case of a DDL batch, this array will always be empty.
ABORT BATCH
: Ends the current batch and removes any DML or DDL statements from
the buffer without sending any statements to Spanner. May only be executed when a (possibly
empty) batch is active.
AbortedException
. This also includes calls to ResultSet.next()
.
If isRetryAbortsInternally()
is true
, then the connection will
silently handle any AbortedException
s by internally re-acquiring all transactional locks
and verifying (via the use of cryptographic checksums) that no underlying data has changed. If a
change to the underlying data is detected, then an AbortedDueToConcurrentModificationException
error will be thrown. If your application already
uses retry loops to handle these Aborted errors, then it will be most efficient to set isRetryAbortsInternally()
to false
.
Use ConnectionOptions
to create a Connection
.
Modifier and Type | Interface and Description |
---|---|
static class |
Connection.InternalMetadataQuery
This query option is used internally to indicate that a query is executed by the library itself
to fetch metadata.
|
Modifier and Type | Method and Description |
---|---|
void |
abortBatch()
Clears all buffered statements in the current batch and ends the batch.
|
void |
addTransactionRetryListener(TransactionRetryListener listener)
Add a
TransactionRetryListener to this Connection for testing and logging
purposes. |
ResultSet |
analyzeQuery(Statement query,
ReadContext.QueryAnalyzeMode queryMode)
Analyzes a query or a DML statement and returns query plan and/or query execution statistics
information.
|
default ResultSetStats |
analyzeUpdate(Statement update,
ReadContext.QueryAnalyzeMode analyzeMode)
Analyzes a DML statement and returns query plan and/or execution statistics information.
|
void |
beginTransaction()
Begins a new transaction for this connection.
|
com.google.api.core.ApiFuture<Void> |
beginTransactionAsync()
Begins a new transaction for this connection.
|
void |
bufferedWrite(Iterable<Mutation> mutations)
Buffers the given mutations locally on the current transaction of this
Connection . |
void |
bufferedWrite(Mutation mutation)
Buffers the given mutation locally on the current transaction of this
Connection . |
void |
cancel()
Cancels the currently running statement on this
Connection (if any). |
void |
clearStatementTimeout()
Clears the statement timeout value for this connection.
|
void |
close()
Closes this connection.
|
com.google.api.core.ApiFuture<Void> |
closeAsync()
Closes this connection without blocking.
|
void |
commit()
Commits the current transaction of this connection.
|
com.google.api.core.ApiFuture<Void> |
commitAsync()
Commits the current transaction of this connection.
|
StatementResult |
execute(Statement statement)
Executes the given statement if allowed in the current
TransactionMode and connection
state. |
AsyncStatementResult |
executeAsync(Statement statement)
Executes the given statement if allowed in the current
TransactionMode and connection
state asynchronously. |
long[] |
executeBatchUpdate(Iterable<Statement> updates)
Executes a list of DML statements in a single request.
|
com.google.api.core.ApiFuture<long[]> |
executeBatchUpdateAsync(Iterable<Statement> updates)
Executes a list of DML statements in a single request.
|
ResultSet |
executeQuery(Statement query,
Options.QueryOption... options)
Executes the given statement as a query and returns the result as a
ResultSet . |
AsyncResultSet |
executeQueryAsync(Statement query,
Options.QueryOption... options)
Executes the given statement asynchronously as a query and returns the result as an
AsyncResultSet . |
long |
executeUpdate(Statement update)
Executes the given statement as a DML statement.
|
com.google.api.core.ApiFuture<Long> |
executeUpdateAsync(Statement update)
Executes the given statement asynchronously as a DML statement.
|
AutocommitDmlMode |
getAutocommitDmlMode() |
CommitResponse |
getCommitResponse() |
com.google.cloud.Timestamp |
getCommitTimestamp() |
default DatabaseClient |
getDatabaseClient()
The
DatabaseClient that is used by this Connection . |
default Dialect |
getDialect()
The
Dialect that is used by this Connection . |
default String |
getOptimizerStatisticsPackage()
Gets the current query optimizer statistics package of this connection.
|
String |
getOptimizerVersion()
Gets the current query optimizer version of this connection.
|
TimestampBound |
getReadOnlyStaleness() |
com.google.cloud.Timestamp |
getReadTimestamp()
Returns the read timestamp of the current/last
TransactionMode.READ_ONLY_TRANSACTION
transaction, or the read timestamp of the last query in autocommit mode. |
default Options.RpcPriority |
getRPCPriority()
Gets the current RPC priority of this connection.
|
default String |
getStatementTag() |
long |
getStatementTimeout(TimeUnit unit) |
TransactionMode |
getTransactionMode() |
Iterator<TransactionRetryListener> |
getTransactionRetryListeners() |
default String |
getTransactionTag() |
boolean |
hasStatementTimeout() |
boolean |
isAutocommit() |
boolean |
isClosed() |
boolean |
isDdlBatchActive() |
boolean |
isDmlBatchActive() |
boolean |
isInTransaction() |
boolean |
isReadOnly() |
boolean |
isRetryAbortsInternally() |
boolean |
isReturnCommitStats() |
boolean |
isTransactionStarted() |
boolean |
removeTransactionRetryListener(TransactionRetryListener listener)
Removes one existing
TransactionRetryListener from this Connection , if it is
present (optional operation). |
void |
rollback()
Rollbacks the current transaction of this connection.
|
com.google.api.core.ApiFuture<Void> |
rollbackAsync()
Rollbacks the current transaction of this connection.
|
long[] |
runBatch()
Sends all buffered DML or DDL statements of the current batch to the database, waits for these
to be executed and ends the current batch.
|
com.google.api.core.ApiFuture<long[]> |
runBatchAsync()
Sends all buffered DML or DDL statements of the current batch to the database, waits for these
to be executed and ends the current batch.
|
void |
setAutocommit(boolean autocommit)
Sets autocommit on/off for this
Connection . |
void |
setAutocommitDmlMode(AutocommitDmlMode mode)
Sets the mode for executing DML statements in autocommit mode for this connection.
|
default void |
setOptimizerStatisticsPackage(String optimizerStatisticsPackage)
Sets the query optimizer statistics package
|
void |
setOptimizerVersion(String optimizerVersion)
Sets the query optimizer version to use for this connection.
|
void |
setReadOnly(boolean readOnly)
Sets this connection to read-only or read-write.
|
void |
setReadOnlyStaleness(TimestampBound staleness)
Sets the staleness to use for the current read-only transaction.
|
void |
setRetryAbortsInternally(boolean retryAbortsInternally)
Sets whether this connection will internally retry read/write transactions that abort.
|
void |
setReturnCommitStats(boolean returnCommitStats)
Sets whether this connection should request commit statistics from Cloud Spanner for read/write
transactions and DML statements in autocommit mode.
|
default void |
setRPCPriority(Options.RpcPriority rpcPriority)
Sets the priority to use for RPCs executed by this connection..
|
default void |
setStatementTag(String tag)
Sets the statement tag to use for the next statement that is executed.
|
void |
setStatementTimeout(long timeout,
TimeUnit unit)
Sets the duration the connection should wait before automatically aborting the execution of a
statement.
|
void |
setTransactionMode(TransactionMode transactionMode)
Sets the transaction mode to use for current transaction.
|
default void |
setTransactionTag(String tag)
Sets the transaction tag to use for the current transaction.
|
void |
startBatchDdl()
Starts a new DDL batch on this connection.
|
void |
startBatchDml()
Starts a new DML batch on this connection.
|
void |
write(Iterable<Mutation> mutations)
Writes the specified mutations directly to the database and commits the changes.
|
void |
write(Mutation mutation)
Writes the specified mutation directly to the database and commits the change.
|
com.google.api.core.ApiFuture<Void> |
writeAsync(Iterable<Mutation> mutations)
Writes the specified mutations directly to the database and commits the changes.
|
com.google.api.core.ApiFuture<Void> |
writeAsync(Mutation mutation)
Writes the specified mutation directly to the database and commits the change.
|
void close()
Connection
has already been closed.close
in interface AutoCloseable
com.google.api.core.ApiFuture<Void> closeAsync()
Connection
has already
been closed. The Connection
is no longer usable directly after calling this method. The
returned ApiFuture
is done when the running statement(s) (if any) on the connection
have finished.boolean isClosed()
true
if this connection has been closed.void setAutocommit(boolean autocommit)
Connection
. Connections in autocommit mode will apply
any changes to the database directly without waiting for an explicit commit. DDL- and DML
statements as well as Mutation
s are sent directly to Spanner, and committed
automatically unless the statement caused an error. The statement is retried in case of an
AbortedException
. All other errors will cause the underlying transaction to be rolled
back.
A Connection
that is in autocommit and read/write mode will allow all types of
statements: Queries, DML, DDL, and Mutations (writes). If the connection is in read-only mode,
only queries will be allowed.
Connection
s in autocommit mode may also accept partitioned DML statements. See
setAutocommitDmlMode(AutocommitDmlMode)
for more information.
autocommit
- true/false to turn autocommit on/offboolean isAutocommit()
true
if this connection is in autocommit modevoid setReadOnly(boolean readOnly)
readOnly
- true/false to turn read-only mode on/offboolean isReadOnly()
true
if this connection is in read-only modevoid setStatementTimeout(long timeout, TimeUnit unit)
commit()
and
rollback()
statements.
A DML statement in autocommit mode may or may not have actually been applied to the database, depending on when the timeout occurred.
A DML statement in a transaction that times out may still have been applied to the transaction. If you still decide to commit the transaction after such a timeout, the DML statement may or may not have been part of the transaction, depending on whether the timeout occurred before or after the statement was (successfully) sent to Spanner. You should therefore either always rollback a transaction that had a DML statement that timed out, or you should accept that the timed out statement still might have been applied to the database.
DDL statements and DML statements in AutocommitDmlMode.PARTITIONED_NON_ATOMIC
mode
cannot be rolled back. If such a statement times out, it may or may not have been applied to
the database. The same applies to commit and rollback statements.
Statements that time out will throw a SpannerException
with error code ErrorCode.DEADLINE_EXCEEDED
.
timeout
- The number of TimeUnit
s before a statement is automatically aborted by
the connection. Zero or negative values are not allowed. The maximum allowed value is
315,576,000,000 seconds. Use clearStatementTimeout()
to remove a timeout
value that has been set.unit
- The TimeUnit
to specify the timeout value in. Must be one of TimeUnit.NANOSECONDS
, TimeUnit.MICROSECONDS
, TimeUnit.MILLISECONDS
, TimeUnit.SECONDS
.void clearStatementTimeout()
long getStatementTimeout(TimeUnit unit)
unit
- The TimeUnit
to get the timeout value in. Must be one of TimeUnit.NANOSECONDS
, TimeUnit.MICROSECONDS
, TimeUnit.MILLISECONDS
, TimeUnit.SECONDS
boolean hasStatementTimeout()
true
if this Connection
has a statement timeout value.void cancel()
Connection
(if any). If canceling the
statement execution succeeds, the statement will be terminated and a SpannerException
with code ErrorCode.CANCELLED
will be thrown. The result of the statement will be the
same as when a statement times out (see setStatementTimeout(long, TimeUnit)
for more information).
Canceling a DDL statement in autocommit mode or a RUN BATCH statement of a DDL batch will cause the connection to try to cancel the execution of the DDL statement(s). This is not guaranteed to cancel the execution of the statement(s) on Cloud Spanner. See https://cloud.google.com/spanner/docs/reference/rpc/google.longrunning#google.longrunning.Operations.CancelOperation for more information.
Canceling a DML statement that is running in AutocommitDmlMode.PARTITIONED_NON_ATOMIC
mode will not cancel a statement on Cloud Spanner
that is already being executed, and its effects will still be applied to the database.
void beginTransaction()
SpannerException
SpannerException
(no nested transactions)
com.google.api.core.ApiFuture<Void> beginTransactionAsync()
ApiFuture
will be done when the transaction has been initialized.
SpannerException
SpannerException
(no nested transactions)
void setTransactionMode(TransactionMode transactionMode)
transactionMode
- The transaction mode to use for the current transaction.
TransactionMode.READ_ONLY_TRANSACTION
will create a read-only transaction and
prevent any changes to written to the database through this transaction. The read
timestamp to be used will be determined based on the current readOnlyStaleness
setting of this connection. It is recommended to use TransactionMode.READ_ONLY_TRANSACTION
instead of TransactionMode.READ_WRITE_TRANSACTION
when possible, as read-only transactions do
not acquire locks on Cloud Spanner, and read-only transactions never abort.
TransactionMode.READ_WRITE_TRANSACTION
this value is only allowed when the
connection is not in read-only mode and will create a read-write transaction. If
isRetryAbortsInternally()
is true
, each read/write
transaction will keep track of a running SHA256 checksum for each ResultSet
that is returned in order to be able to retry the transaction in case the transaction
is aborted by Spanner.
TransactionMode getTransactionMode()
default void setTransactionTag(String tag)
The tag will be set as the transaction tag of all statements during the transaction, and as the transaction tag of the commit.
The transaction tag will automatically be cleared after the transaction has ended.
tag
- The tag to use.default String getTransactionTag()
default void setStatementTag(String tag)
Statement tags are not allowed before COMMIT and ROLLBACK statements.
Statement tags are allowed before START BATCH DML statements and will be included in the
ExecuteBatchDmlRequest
that is sent to Spanner. Statement tags are not allowed inside a
batch.
tag
- The statement tag to use with the next statement that will be executed on this
connection.default String getStatementTag()
boolean isRetryAbortsInternally()
true
if this connection will automatically retry read/write transactions
that abort. This method may only be called when the connection is in read/write
transactional mode and no transaction has been started yet.void setRetryAbortsInternally(boolean retryAbortsInternally)
true
. When internal retry is enabled, the Connection
will keep
track of a running SHA256 checksum of all ResultSet
s that have been returned from Cloud
Spanner. If the checksum that is calculated during an internal retry differs from the original
checksum, the transaction will abort with an AbortedDueToConcurrentModificationException
.
Note that retries of a read/write transaction that calls a non-deterministic function on Cloud Spanner, such as CURRENT_TIMESTAMP(), will never be successful, as the data returned during the retry will always be different from the original transaction.
It is also highly recommended that all queries in a read/write transaction have an ORDER BY clause that guarantees that the data is returned in the same order as in the original transaction if the transaction is internally retried. The most efficient way to achieve this is to always include the primary key columns at the end of the ORDER BY clause.
This method may only be called when the connection is in read/write transactional mode and no transaction has been started yet.
retryAbortsInternally
- Set to true
to internally retry transactions that are
aborted by Spanner. When set to false
, any database call on a transaction that
has been aborted by Cloud Spanner will throw an AbortedException
instead of being
retried. Set this to false if your application already uses retry loops to handle AbortedException
s.void addTransactionRetryListener(TransactionRetryListener listener)
TransactionRetryListener
to this Connection
for testing and logging
purposes. The method TransactionRetryListener.retryStarting(Timestamp, long, int)
will
be called before an automatic retry is started for a read/write transaction on this connection.
The method TransactionRetryListener.retryFinished(Timestamp, long, int,
TransactionRetryListener.RetryResult)
will be called after the retry has finished.listener
- The listener to add to this connection.boolean removeTransactionRetryListener(TransactionRetryListener listener)
TransactionRetryListener
from this Connection
, if it is
present (optional operation).listener
- The listener to remove from the connection.true
if a listener was removed from the connection.Iterator<TransactionRetryListener> getTransactionRetryListeners()
TransactionRetryListener
s registered for this
connection.void setAutocommitDmlMode(AutocommitDmlMode mode)
AutocommitDmlMode.TRANSACTIONAL
when
autocommit mode is changed on the connection.mode
- The DML autocommit mode to use
AutocommitDmlMode.TRANSACTIONAL
DML statements are executed as single
read-write transaction. After successful execution, the DML statement is guaranteed
to have been applied exactly once to the database
AutocommitDmlMode.PARTITIONED_NON_ATOMIC
DML statements are executed as
partitioned DML transactions. If an error occurs during the execution of the DML
statement, it is possible that the statement has been applied to some but not all of
the rows specified in the statement.
AutocommitDmlMode getAutocommitDmlMode()
AutocommitDmlMode
setting for this connection. This method may only
be called on a connection that is in autocommit mode and not while in a temporary
transaction.void setReadOnlyStaleness(TimestampBound staleness)
TransactionMode.READ_ONLY_TRANSACTION
and there is no transaction that has started, or when
the connection is in read-only and autocommit mode.staleness
- The staleness to use for the current but not yet started read-only transactionTimestampBound getReadOnlyStaleness()
void setOptimizerVersion(String optimizerVersion)
optimizerVersion
- The query optimizer version to use. Must be a valid optimizer version
number, the string LATEST
or an empty string. The empty string will instruct
the connection to use the optimizer version that is defined in the environment variable
SPANNER_OPTIMIZER_VERSION
. If no value is specified in the environment
variable, the default query optimizer of Cloud Spanner is used.String getOptimizerVersion()
default void setOptimizerStatisticsPackage(String optimizerStatisticsPackage)
optimizerStatisticsPackage
- The query optimizer statistics package to use. Must be a
string composed of letters, numbers, dashes and underscores or an empty string. The empty
string will instruct the connection to use the optimizer statistics package that is defined
the environment variable SPANNER_OPTIMIZER_STATISTICS_PACKAGE
. If no value is
specified in the environment variable, the client level query optimizer is used. If none is
set, the default query optimizer of Cloud Spanner is used.default String getOptimizerStatisticsPackage()
void setReturnCommitStats(boolean returnCommitStats)
boolean isReturnCommitStats()
default void setRPCPriority(Options.RpcPriority rpcPriority)
rpcPriority
- The RPC priority to use.
Options.RpcPriority.HIGH
This specifies that the RPC's invocation will be of high
priority.
Options.RpcPriority.MEDIUM
This specifies that the RPC's invocation will be of medium
priority.
Options.RpcPriority.LOW
This specifies that the RPC's invocation will be of low
priority.
default Options.RpcPriority getRPCPriority()
void commit()
If the connection is in autocommit mode, and there is a temporary transaction active on this connection, calling this method will cause the connection to go back to autocommit mode after calling this method.
This method will throw a SpannerException
with code ErrorCode.DEADLINE_EXCEEDED
if a statement timeout has been set on this connection, and the
commit operation takes longer than this timeout.
TransactionMode.READ_WRITE_TRANSACTION
. Committing an empty transaction
also does not generate a read timestamp or a commit timestamp, and calling one of the
methods getReadTimestamp()
or getCommitTimestamp()
will cause an exception.
TransactionMode.READ_ONLY_TRANSACTION
transaction will end that transaction. If the connection is in read-write mode, any
subsequent transaction will by default be a TransactionMode.READ_WRITE_TRANSACTION
transaction, unless any following transaction is
explicitly set to TransactionMode.READ_ONLY_TRANSACTION
TransactionMode.READ_WRITE_TRANSACTION
transaction will send all buffered mutations to the database, commit any DML statements
that have been executed during this transaction and end the transaction.
com.google.api.core.ApiFuture<Void> commitAsync()
This method is guaranteed to be non-blocking. The returned ApiFuture
will be done
when the transaction has committed or the commit has failed.
Calling this method will always end the current transaction and start a new transaction when
the next statement is executed, regardless whether this commit call succeeded or failed. If the
next statement(s) rely on the results of the transaction that is being committed, it is
recommended to check the status of this commit by inspecting the value of the returned ApiFuture
before executing the next statement, to ensure that the commit actually succeeded.
If the connection is in autocommit mode, and there is a temporary transaction active on this connection, calling this method will cause the connection to go back to autocommit mode after calling this method.
This method will throw a SpannerException
with code ErrorCode.DEADLINE_EXCEEDED
if a statement timeout has been set on this connection, and the
commit operation takes longer than this timeout.
TransactionMode.READ_WRITE_TRANSACTION
. Committing an empty transaction
also does not generate a read timestamp or a commit timestamp, and calling one of the
methods getReadTimestamp()
or getCommitTimestamp()
will cause an exception.
TransactionMode.READ_ONLY_TRANSACTION
transaction will end that transaction. If the connection is in read-write mode, any
subsequent transaction will by default be a TransactionMode.READ_WRITE_TRANSACTION
transaction, unless any following transaction is
explicitly set to TransactionMode.READ_ONLY_TRANSACTION
TransactionMode.READ_WRITE_TRANSACTION
transaction will send all buffered mutations to the database, commit any DML statements
that have been executed during this transaction and end the transaction.
void rollback()
If the connection is in autocommit mode, and there is a temporary transaction active on this connection, calling this method will cause the connection to go back to autocommit mode after calling this method.
TransactionMode.READ_WRITE_TRANSACTION
.
TransactionMode.READ_ONLY_TRANSACTION
transaction will end that transaction. If the connection is in read-write mode, any
subsequent transaction will by default be a TransactionMode.READ_WRITE_TRANSACTION
transaction, unless any following transaction is
explicitly set to TransactionMode.READ_ONLY_TRANSACTION
TransactionMode.READ_WRITE_TRANSACTION
transaction will clear all buffered mutations, rollback any DML statements that have been
executed during this transaction and end the transaction.
com.google.api.core.ApiFuture<Void> rollbackAsync()
This method is guaranteed to be non-blocking. The returned ApiFuture
will be done
when the transaction has been rolled back.
If the connection is in autocommit mode, and there is a temporary transaction active on this connection, calling this method will cause the connection to go back to autocommit mode after calling this method.
TransactionMode.READ_WRITE_TRANSACTION
.
TransactionMode.READ_ONLY_TRANSACTION
transaction will end that transaction. If the connection is in read-write mode, any
subsequent transaction will by default be a TransactionMode.READ_WRITE_TRANSACTION
transaction, unless any following transaction is
explicitly set to TransactionMode.READ_ONLY_TRANSACTION
TransactionMode.READ_WRITE_TRANSACTION
transaction will clear all buffered mutations, rollback any DML statements that have been
executed during this transaction and end the transaction.
boolean isInTransaction()
true
if this connection has a transaction (that has not necessarily
started). This method will only return false when the Connection
is in autocommit
mode and no explicit transaction has been started by calling beginTransaction()
. If the Connection
is not in autocommit mode, there
will always be a transaction.boolean isTransactionStarted()
true
if this connection has a transaction that has started. A transaction
is automatically started by the first statement that is executed in the transaction.com.google.cloud.Timestamp getReadTimestamp()
TransactionMode.READ_ONLY_TRANSACTION
transaction, or the read timestamp of the last query in autocommit mode.
TransactionMode.READ_ONLY_TRANSACTION
transaction that has started (a
query has been executed), or that has just committed: The read timestamp of the
transaction. If the read-only transaction was committed without ever executing a query,
calling this method after the commit will also throw a SpannerException
SpannerException
.
com.google.cloud.Timestamp getCommitTimestamp()
TransactionMode.READ_WRITE_TRANSACTION
transaction. This method throws a SpannerException
if there is no last TransactionMode.READ_WRITE_TRANSACTION
transaction. That is, if the last transaction was a
TransactionMode.READ_ONLY_TRANSACTION
), or if the last TransactionMode.READ_WRITE_TRANSACTION
transaction rolled back. It also throws a SpannerException
if the last TransactionMode.READ_WRITE_TRANSACTION
transaction
was empty when committed.CommitResponse getCommitResponse()
CommitResponse
of the last TransactionMode.READ_WRITE_TRANSACTION
transaction. This method throws a SpannerException
if there is no last TransactionMode.READ_WRITE_TRANSACTION
transaction. That is, if the last transaction was a
TransactionMode.READ_ONLY_TRANSACTION
), or if the last TransactionMode.READ_WRITE_TRANSACTION
transaction rolled back. It also throws a SpannerException
if the last TransactionMode.READ_WRITE_TRANSACTION
transaction
was empty when committed.void startBatchDdl()
This method may only be called when the connection is in read/write mode, autocommit mode is enabled or no read/write transaction has been started, and there is not already another batch active. The connection will only accept DDL statements while a DDL batch is active.
void startBatchDml()
SpannerBatchUpdateException
for the statement that could not be executed. Preceding statements
of the batch will have been executed, and the update counts of those statements can be
retrieved through SpannerBatchUpdateException.getUpdateCounts()
.
This method may only be called when the connection is in read/write mode, autocommit mode is enabled or no read/write transaction has been started, and there is not already another batch active. The connection will only accept DML statements while a DML batch is active.
long[] runBatch()
This method may only be called when a (possibly empty) batch is active.
com.google.api.core.ApiFuture<long[]> runBatchAsync()
This method is guaranteed to be non-blocking. The returned ApiFuture
will be done
when the batch has been successfully applied, or when one or more of the statements in the
batch has failed and the further execution of the batch has been halted.
This method may only be called when a (possibly empty) batch is active.
ApiFuture
containing the update counts in case of a DML batch. The ApiFuture
contains an array containing 1 for each successful statement and 0 for each
failed statement or statement that was not executed in case of a DDL batch.void abortBatch()
This method may only be called when a (possibly empty) batch is active.
boolean isDdlBatchActive()
true
if a DDL batch is active on this connection.boolean isDmlBatchActive()
true
if a DML batch is active on this connection.StatementResult execute(Statement statement)
TransactionMode
and connection
state. The returned value depends on the type of statement:
ResultSet
StatementResult.ResultType.NO_RESULT
ResultSet
or StatementResult.ResultType.NO_RESULT
, depending on the type of statement (SHOW or SET)
statement
- The statement to executeAsyncStatementResult executeAsync(Statement statement)
TransactionMode
and connection
state asynchronously. The returned value depends on the type of statement:
AsyncResultSet
ApiFuture
with an update count that is done when
the DML statement has been applied successfully, or that throws an ExecutionException
if the DML statement failed.
ApiFuture
containing a Void
that is done
when the DDL statement has been applied successfully, or that throws an ExecutionException
if the DDL statement failed.
ResultSet
or StatementResult.ResultType.NO_RESULT
, depending on the type of statement (SHOW or SET)
statement
- The statement to executeResultSet executeQuery(Statement query, Options.QueryOption... options)
ResultSet
. This
method blocks and waits for a response from Spanner. If the statement does not contain a valid
query, the method will throw a SpannerException
.query
- The query statement to executeoptions
- the options to configure the queryResultSet
with the results of the queryAsyncResultSet executeQueryAsync(Statement query, Options.QueryOption... options)
AsyncResultSet
. This method is guaranteed to be non-blocking. If the statement does not
contain a valid query, the method will throw a SpannerException
.
See AsyncResultSet.setCallback(java.util.concurrent.Executor,
com.google.cloud.spanner.AsyncResultSet.ReadyCallback)
for more information on how to consume
the results of the query asynchronously.
It is also possible to consume the returned AsyncResultSet
in the same way as a
normal ResultSet
, i.e. in a while-loop calling ResultSet.next()
.
query
- The query statement to executeoptions
- the options to configure the queryAsyncResultSet
with the results of the queryResultSet analyzeQuery(Statement query, ReadContext.QueryAnalyzeMode queryMode)
The query plan and query statistics information is contained in ResultSetStats
that can be accessed by calling ResultSet.getStats()
on the returned ResultSet
.
ResultSet resultSet =
connection.analyzeQuery(
Statement.of("SELECT SingerId, AlbumId, MarketingBudget FROM Albums"),
ReadContext.QueryAnalyzeMode.PROFILE);
while (resultSet.next()) {
// Discard the results. We're only processing because getStats() below requires it.
}
ResultSetStats stats = resultSet.getStats();
query
- the query statement to executequeryMode
- the mode in which to execute the querylong executeUpdate(Statement update)
SpannerException
.update
- The update statement to executedefault ResultSetStats analyzeUpdate(Statement update, ReadContext.QueryAnalyzeMode analyzeMode)
ReadContext.QueryAnalyzeMode.PLAN
only returns the plan for
the statement. ReadContext.QueryAnalyzeMode.PROFILE
executes
the DML statement, returns the modified row count and execution statistics, and the effects of
the DML statement will be visible to subsequent operations in the transaction.
com.google.api.core.ApiFuture<Long> executeUpdateAsync(Statement update)
SpannerException
.
This method is guaranteed to be non-blocking.
update
- The update statement to executeApiFuture
containing the number of records that were
inserted/updated/deleted by this statementlong[] executeBatchUpdate(Iterable<Statement> updates)
executeUpdate(Statement)
in a loop. This method returns an array of long integers,
each representing the number of rows modified by each statement.
If an individual statement fails, execution stops and a SpannerBatchUpdateException
is returned, which includes the error and the number of rows affected by the statements that
are run prior to the error.
For example, if statements contains 3 statements, and the 2nd one is not a valid DML. This
method throws a SpannerBatchUpdateException
that contains the error message from the
2nd statement, and an array of length 1 that contains the number of rows modified by the 1st
statement. The 3rd statement will not run. Executes the given statements as DML statements in
one batch. If one of the statements does not contain a valid DML statement, the method will
throw a SpannerException
.
updates
- The update statements that will be executed as one batch.com.google.api.core.ApiFuture<long[]> executeBatchUpdateAsync(Iterable<Statement> updates)
executeUpdate(Statement)
in a loop. This method returns an ApiFuture
that
contains an array of long integers, each representing the number of rows modified by each
statement.
This method is guaranteed to be non-blocking.
If an individual statement fails, execution stops and a SpannerBatchUpdateException
is returned, which includes the error and the number of rows affected by the statements that
are run prior to the error.
For example, if statements contains 3 statements, and the 2nd one is not a valid DML. This
method throws a SpannerBatchUpdateException
that contains the error message from the
2nd statement, and an array of length 1 that contains the number of rows modified by the 1st
statement. The 3rd statement will not run. Executes the given statements as DML statements in
one batch. If one of the statements does not contain a valid DML statement, the method will
throw a SpannerException
.
updates
- The update statements that will be executed as one batch.ApiFuture
containing an array with the update counts per statement.void write(Mutation mutation)
write(Iterable)
.
Calling this method is only allowed in autocommit mode. See bufferedWrite(Iterable)
for writing mutations in transactions.
mutation
- The Mutation
to write to the databaseSpannerException
- if the Connection
is not in autocommit modecom.google.api.core.ApiFuture<Void> writeAsync(Mutation mutation)
ApiFuture
. Writing multiple
mutations to a database by calling this method multiple times mode is inefficient, as each call
will need a round trip to the database. Instead, you should consider writing the mutations
together by calling writeAsync(Iterable)
.
This method is guaranteed to be non-blocking.
Calling this method is only allowed in autocommit mode. See bufferedWrite(Iterable)
for writing mutations in transactions.
mutation
- The Mutation
to write to the databaseSpannerException
- if the Connection
is not in autocommit modevoid write(Iterable<Mutation> mutations)
Calling this method is only allowed in autocommit mode. See bufferedWrite(Iterable)
for writing mutations in transactions.
mutations
- The Mutation
s to write to the databaseSpannerException
- if the Connection
is not in autocommit modecom.google.api.core.ApiFuture<Void> writeAsync(Iterable<Mutation> mutations)
ApiFuture
.
This method is guaranteed to be non-blocking.
Calling this method is only allowed in autocommit mode. See bufferedWrite(Iterable)
for writing mutations in transactions.
mutations
- The Mutation
s to write to the databaseSpannerException
- if the Connection
is not in autocommit modevoid bufferedWrite(Mutation mutation)
Connection
. The
mutation will be written to the database at the next call to commit()
. The
value will not be readable on this Connection
before the transaction is committed.
Calling this method is only allowed when not in autocommit mode. See write(Mutation)
for writing mutations in autocommit mode.
mutation
- the Mutation
to buffer for writing to the database on the next commitSpannerException
- if the Connection
is in autocommit modevoid bufferedWrite(Iterable<Mutation> mutations)
Connection
. The
mutations will be written to the database at the next call to commit()
. The
values will not be readable on this Connection
before the transaction is committed.
Calling this method is only allowed when not in autocommit mode. See write(Iterable)
for writing mutations in autocommit mode.
mutations
- the Mutation
s to buffer for writing to the database on the next commitSpannerException
- if the Connection
is in autocommit modedefault Dialect getDialect()
Dialect
that is used by this Connection
.@InternalApi default DatabaseClient getDatabaseClient()
DatabaseClient
that is used by this Connection
.Copyright © 2022 Google LLC. All rights reserved.