Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Halaman ini menjelaskan cara menetapkan waktu tunggu untuk transaksi menggunakan
library klien Spanner. Transaksi gagal dengan
error DEADLINE_EXCEEDED jika transaksi tidak dapat selesai dalam nilai waktu tunggu
yang ditentukan.
Anda dapat menetapkan nilai waktu tunggu untuk transaksi dan untuk
pernyataan permintaan RPC. Menetapkan
nilai waktu tunggu yang lebih lama untuk transaksi daripada nilai waktu tunggu untuk
pernyataan yang dieksekusi dalam transaksi tidak akan meningkatkan
waktu tunggu untuk pernyataan, yang dibatasi oleh nilai waktu tunggunya sendiri.
Selain itu, jika error waktu tunggu terjadi selama eksekusi
permintaan Commit, transaksi masih mungkin
di-commit.
Anda dapat menetapkan waktu tunggu transaksi menggunakan library klien Go dan 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;});});}}}}
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","otherUp","thumb-up"]],[["Sulit dipahami","hardToUnderstand","thumb-down"],["Informasi atau kode contoh salah","incorrectInformationOrSampleCode","thumb-down"],["Informasi/contoh yang saya butuhkan tidak ada","missingTheInformationSamplesINeed","thumb-down"],["Masalah terjemahan","translationIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 2025-02-01 UTC."],[],[]]