Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
En esta página, se describe cómo establecer un tiempo de espera para las transacciones con las bibliotecas cliente de Spanner. La transacción falla con un error DEADLINE_EXCEEDED si no puede finalizar dentro del valor de tiempo de espera determinado.
Puedes establecer valores de tiempo de espera para las transacciones y para las declaraciones de solicitud de RPC. Establecer un valor de tiempo de espera más largo para la transacción que el valor de tiempo de espera de la sentencia que se ejecuta en la transacción no aumenta el tiempo de espera de la sentencia, que está limitado por su propio valor de tiempo de espera.
Además, si el error de tiempo de espera se produce durante la ejecución de la solicitud Commit, es posible que la transacción se haya confirmado.
Puedes establecer un tiempo de espera de transacción con las bibliotecas cliente de Go y 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 comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Difícil de entender","hardToUnderstand","thumb-down"],["Información o código de muestra incorrectos","incorrectInformationOrSampleCode","thumb-down"],["Faltan la información o los ejemplos que necesito","missingTheInformationSamplesINeed","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 2025-01-30 (UTC)"],[],[]]