Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
Esta página descreve como definir um tempo limite para transações usando as
bibliotecas de cliente do Spanner. A transação falha com um
erro DEADLINE_EXCEEDED se não puder ser concluída dentro do valor de
tempo limite especificado.
É possível definir valores de tempo limite para transações e para
instruções de solicitação de RPC. Definir um
valor de tempo limite mais longo para a transação do que o valor de tempo limite da
instrução executada na transação não aumenta o
tempo limite da instrução, que é limitado pelo próprio valor de tempo limite.
Além disso, se o erro de tempo limite ocorrer durante a execução da
solicitação Commit, ainda será possível que a transação tenha sido
confirmada.
É possível definir um tempo limite de transação usando as bibliotecas de cliente Go e Java.
Go
import("context""errors""fmt""io""time""cloud.google.com/go/spanner""google.golang.org/api/iterator""google.golang.org/grpc/codes")functransactionTimeout(wio.Writer,dbstring)error{ctx:=context.Background()client,err:=spanner.NewClient(ctx,db)iferr!=nil{returnerr}deferclient.Close()// Create a context with a 60-second timeout and use this context to run a read/write transaction.// This context timeout will be applied to the entire transaction, and the transaction will fail// if it cannot finish within the specified timeout value. The Spanner client library applies the// (remainder of the) timeout to each statement that is executed in the transaction.ctx,cancel:=context.WithTimeout(context.Background(),60*time.Second)defercancel()_,err=client.ReadWriteTransaction(ctx,func(ctxcontext.Context,txn*spanner.ReadWriteTransaction)error{selectStmt:=spanner.Statement{SQL:`SELECT SingerId, FirstName, LastName FROM Singers ORDER BY LastName, FirstName`,}// The context that is passed in to the transaction function should be used for each statement// is executed.iter:=txn.Query(ctx,selectStmt)deferiter.Stop()for{row,err:=iter.Next()iferrors.Is(err,iterator.Done){break}iferr!=nil{returnerr}varsingerIDint64varfirstName,lastNamestringiferr:=row.Columns(&singerID,&firstName,&lastName);err!=nil{returnerr}fmt.Fprintf(w,"%d %s %s\n",singerID,firstName,lastName)}stmt:=spanner.Statement{SQL:`INSERT INTO Singers (SingerId, FirstName, LastName) VALUES (38, 'George', 'Washington')`,}rowCount,err:=txn.Update(ctx,stmt)iferr!=nil{returnerr}fmt.Fprintf(w,"%d record(s) inserted.\n",rowCount)returnnil})// Check if an error was returned by the transaction.// The spanner.ErrCode(err) function will return codes.OK if err == nil.code:=spanner.ErrCode(err)ifcode==codes.OK{fmt.Fprintf(w,"Transaction with timeout was executed successfully\n")}elseifcode==codes.DeadlineExceeded{fmt.Fprintf(w,"Transaction timed out\n")}else{fmt.Fprintf(w,"Transaction failed with error code %v\n",code)}returnerr}
Java
importcom.google.cloud.spanner.DatabaseClient;importcom.google.cloud.spanner.DatabaseId;importcom.google.cloud.spanner.ResultSet;importcom.google.cloud.spanner.Spanner;importcom.google.cloud.spanner.SpannerOptions;importcom.google.cloud.spanner.Statement;importio.grpc.Context;importio.grpc.Context.CancellableContext;importio.grpc.Deadline;importjava.util.concurrent.Executors;importjava.util.concurrent.ScheduledExecutorService;importjava.util.concurrent.TimeUnit;/** * Sample showing how to set a timeout for an entire transaction for the Cloud Spanner Java client. */classTransactionTimeoutExample{staticvoidexecuteTransactionWithTimeout(){// TODO(developer): Replace these variables before running the sample.StringprojectId="my-project";StringinstanceId="my-instance";StringdatabaseId="my-database";executeTransactionWithTimeout(projectId,instanceId,databaseId,60L,TimeUnit.SECONDS);}// Execute a read/write transaction with a timeout for the entire transaction.staticvoidexecuteTransactionWithTimeout(StringprojectId,StringinstanceId,StringdatabaseId,longtimeoutValue,TimeUnittimeoutUnit){try(Spannerspanner=SpannerOptions.newBuilder().setProjectId(projectId).build().getService()){DatabaseClientclient=spanner.getDatabaseClient(DatabaseId.of(projectId,instanceId,databaseId));// Create a gRPC context with a deadline and with cancellation.// gRPC context deadlines require the use of a scheduled executor.ScheduledExecutorServiceexecutor=Executors.newSingleThreadScheduledExecutor();try(CancellableContextcontext=Context.current().withDeadline(Deadline.after(timeoutValue,timeoutUnit),executor).withCancellation()){context.run(()->{client.readWriteTransaction().run(transaction->{try(ResultSetresultSet=transaction.executeQuery(Statement.of("SELECT SingerId, FirstName, LastName\n"+"FROM Singers\n"+"ORDER BY LastName, FirstName"))){while(resultSet.next()){System.out.printf("%d %s %s\n",resultSet.getLong("SingerId"),resultSet.getString("FirstName"),resultSet.getString("LastName"));}}Stringsql="INSERT INTO Singers (SingerId, FirstName, LastName)\n"+"VALUES (20, 'George', 'Washington')";longrowCount=transaction.executeUpdate(Statement.of(sql));System.out.printf("%d record inserted.%n",rowCount);returnnull;});});}}}}
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Difícil de entender","hardToUnderstand","thumb-down"],["Informações incorretas ou exemplo de código","incorrectInformationOrSampleCode","thumb-down"],["Não contém as informações/amostras de que eu preciso","missingTheInformationSamplesINeed","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2025-01-30 UTC."],[],[]]