Mit Sammlungen den Überblick behalten
Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.
Auf dieser Seite wird beschrieben, wie Sie mit den Spanner-Clientbibliotheken ein Zeitlimit für Transaktionen festlegen. Die Transaktion schlägt mit einem DEADLINE_EXCEEDED-Fehler fehl, wenn sie nicht innerhalb des angegebenen Zeitlimits abgeschlossen werden kann.
Sie können Zeitüberschreitungswerte für Transaktionen und für RPC-Anfrageanweisungen festlegen. Wenn Sie für die Transaktion einen längeren Zeitüberschreitungswert als für die Anweisung festlegen, die in der Transaktion ausgeführt wird, wird die Zeitüberschreitung für die Anweisung nicht erhöht. Sie ist durch ihren eigenen Zeitüberschreitungswert begrenzt.
Auch wenn der Zeitüberschreitungsfehler während der Ausführung der Commit-Anfrage auftritt, ist es möglich, dass die Transaktion durchgeführt wurde.
Sie können mit den Go- und Java-Clientbibliotheken ein Transaktionstimeout festlegen.
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;});});}}}}
[[["Leicht verständlich","easyToUnderstand","thumb-up"],["Mein Problem wurde gelöst","solvedMyProblem","thumb-up"],["Sonstiges","otherUp","thumb-up"]],[["Schwer verständlich","hardToUnderstand","thumb-down"],["Informationen oder Beispielcode falsch","incorrectInformationOrSampleCode","thumb-down"],["Benötigte Informationen/Beispiele nicht gefunden","missingTheInformationSamplesINeed","thumb-down"],["Problem mit der Übersetzung","translationIssue","thumb-down"],["Sonstiges","otherDown","thumb-down"]],["Zuletzt aktualisiert: 2025-01-09 (UTC)."],[],[]]