@@ -1036,6 +1036,88 @@ func TestClient_ReadWriteTransactionWithOptions(t *testing.T) {
1036
1036
}
1037
1037
}
1038
1038
1039
+ func TestClient_ReadWriteTransactionWithOptimisticLockMode_ExecuteSqlRequest (t * testing.T ) {
1040
+ server , client , teardown := setupMockedTestServer (t )
1041
+ defer teardown ()
1042
+ ctx := context .Background ()
1043
+ server .TestSpanner .PutExecutionTime (MethodExecuteStreamingSql ,
1044
+ SimulatedExecutionTime {
1045
+ Errors : []error {status .Error (codes .Unavailable , "Temporary unavailable" ), status .Error (codes .Aborted , "Transaction aborted" )},
1046
+ })
1047
+ _ , err := client .ReadWriteTransactionWithOptions (ctx , func (ctx context.Context , tx * ReadWriteTransaction ) error {
1048
+ iter := tx .Query (ctx , NewStatement (SelectSingerIDAlbumIDAlbumTitleFromAlbums ))
1049
+ defer iter .Stop ()
1050
+ _ , err := iter .Next ()
1051
+ return err
1052
+ }, TransactionOptions {ReadLockMode : sppb .TransactionOptions_ReadWrite_OPTIMISTIC })
1053
+ if err != nil {
1054
+ t .Fatalf ("Failed to execute the transaction: %s" , err )
1055
+ }
1056
+ requests := drainRequestsFromServer (server .TestSpanner )
1057
+ if err := compareRequests ([]interface {}{
1058
+ & sppb.BatchCreateSessionsRequest {},
1059
+ & sppb.ExecuteSqlRequest {},
1060
+ & sppb.ExecuteSqlRequest {},
1061
+ & sppb.BeginTransactionRequest {},
1062
+ & sppb.ExecuteSqlRequest {},
1063
+ & sppb.CommitRequest {}}, requests ); err != nil {
1064
+ t .Fatal (err )
1065
+ }
1066
+ if requests [1 ].(* sppb.ExecuteSqlRequest ).GetTransaction ().GetBegin ().GetReadWrite ().GetReadLockMode () != sppb .TransactionOptions_ReadWrite_OPTIMISTIC {
1067
+ t .Fatal ("Transaction is not set to optimistic" )
1068
+ }
1069
+ if requests [2 ].(* sppb.ExecuteSqlRequest ).GetTransaction ().GetBegin ().GetReadWrite ().GetReadLockMode () != sppb .TransactionOptions_ReadWrite_OPTIMISTIC {
1070
+ t .Fatal ("Transaction is not set to optimistic" )
1071
+ }
1072
+ if requests [3 ].(* sppb.BeginTransactionRequest ).GetOptions ().GetReadWrite ().GetReadLockMode () != sppb .TransactionOptions_ReadWrite_OPTIMISTIC {
1073
+ t .Fatal ("Begin Transaction is not set to optimistic" )
1074
+ }
1075
+ if _ , ok := requests [4 ].(* sppb.ExecuteSqlRequest ).Transaction .GetSelector ().(* sppb.TransactionSelector_Id ); ! ok {
1076
+ t .Fatal ("expected streaming query to use transactionID from explicit begin transaction" )
1077
+ }
1078
+ }
1079
+
1080
+ func TestClient_ReadWriteTransactionWithOptimisticLockMode_ReadRequest (t * testing.T ) {
1081
+ server , client , teardown := setupMockedTestServer (t )
1082
+ defer teardown ()
1083
+ ctx := context .Background ()
1084
+ server .TestSpanner .PutExecutionTime (MethodStreamingRead ,
1085
+ SimulatedExecutionTime {
1086
+ Errors : []error {status .Error (codes .Unavailable , "Temporary unavailable" ), status .Error (codes .Aborted , "Transaction aborted" )},
1087
+ })
1088
+ _ , err := client .ReadWriteTransactionWithOptions (ctx , func (ctx context.Context , tx * ReadWriteTransaction ) error {
1089
+ iter := tx .Read (ctx , "Albums" , KeySets (Key {"foo" }), []string {"SingerId" , "AlbumId" , "AlbumTitle" })
1090
+ defer iter .Stop ()
1091
+ _ , err := iter .Next ()
1092
+ return err
1093
+ }, TransactionOptions {ReadLockMode : sppb .TransactionOptions_ReadWrite_OPTIMISTIC })
1094
+ if err != nil {
1095
+ t .Fatalf ("Failed to execute the transaction: %s" , err )
1096
+ }
1097
+ requests := drainRequestsFromServer (server .TestSpanner )
1098
+ if err := compareRequests ([]interface {}{
1099
+ & sppb.BatchCreateSessionsRequest {},
1100
+ & sppb.ReadRequest {},
1101
+ & sppb.ReadRequest {},
1102
+ & sppb.BeginTransactionRequest {},
1103
+ & sppb.ReadRequest {},
1104
+ & sppb.CommitRequest {}}, requests ); err != nil {
1105
+ t .Fatal (err )
1106
+ }
1107
+ if requests [1 ].(* sppb.ReadRequest ).GetTransaction ().GetBegin ().GetReadWrite ().GetReadLockMode () != sppb .TransactionOptions_ReadWrite_OPTIMISTIC {
1108
+ t .Fatal ("Transaction is not set to optimistic" )
1109
+ }
1110
+ if requests [2 ].(* sppb.ReadRequest ).GetTransaction ().GetBegin ().GetReadWrite ().GetReadLockMode () != sppb .TransactionOptions_ReadWrite_OPTIMISTIC {
1111
+ t .Fatal ("Transaction is not set to optimistic" )
1112
+ }
1113
+ if requests [3 ].(* sppb.BeginTransactionRequest ).GetOptions ().GetReadWrite ().GetReadLockMode () != sppb .TransactionOptions_ReadWrite_OPTIMISTIC {
1114
+ t .Fatal ("Begin Transaction is not set to optimistic" )
1115
+ }
1116
+ if _ , ok := requests [4 ].(* sppb.ReadRequest ).Transaction .GetSelector ().(* sppb.TransactionSelector_Id ); ! ok {
1117
+ t .Fatal ("expected streaming read to use transactionID from explicit begin transaction" )
1118
+ }
1119
+ }
1120
+
1039
1121
func TestClient_ReadWriteStmtBasedTransaction_TransactionOptions (t * testing.T ) {
1040
1122
for _ , tt := range transactionOptionsTestCases () {
1041
1123
t .Run (tt .name , func (t * testing.T ) {
@@ -2999,6 +3081,12 @@ func transactionOptionsTestCases() []TransactionOptionsTestCase {
2999
3081
write : & TransactionOptions {CommitOptions : CommitOptions {ReturnCommitStats : true }, TransactionTag : "writeTransactionTag" , CommitPriority : sppb .RequestOptions_PRIORITY_MEDIUM },
3000
3082
want : & TransactionOptions {CommitOptions : CommitOptions {ReturnCommitStats : true }, TransactionTag : "writeTransactionTag" , CommitPriority : sppb .RequestOptions_PRIORITY_MEDIUM },
3001
3083
},
3084
+ {
3085
+ name : "Read lock mode is optimistic" ,
3086
+ client : & TransactionOptions {ReadLockMode : sppb .TransactionOptions_ReadWrite_OPTIMISTIC },
3087
+ write : & TransactionOptions {},
3088
+ want : & TransactionOptions {},
3089
+ },
3002
3090
}
3003
3091
}
3004
3092
0 commit comments