@@ -297,6 +297,74 @@ func TestNestedTransactionWithBlock(t *testing.T) {
297
297
}
298
298
}
299
299
300
+ func TestDeeplyNestedTransactionWithBlockAndWrappedCallback (t * testing.T ) {
301
+ transaction := func (ctx context.Context , db * gorm.DB , callback func (ctx context.Context , db * gorm.DB ) error ) error {
302
+ return db .WithContext (ctx ).Transaction (func (tx * gorm.DB ) error {
303
+ return callback (ctx , tx )
304
+ })
305
+ }
306
+ var (
307
+ user = * GetUser ("transaction-nested" , Config {})
308
+ user1 = * GetUser ("transaction-nested-1" , Config {})
309
+ user2 = * GetUser ("transaction-nested-2" , Config {})
310
+ )
311
+
312
+ if err := transaction (context .Background (), DB , func (ctx context.Context , tx * gorm.DB ) error {
313
+ tx .Create (& user )
314
+
315
+ if err := tx .First (& User {}, "name = ?" , user .Name ).Error ; err != nil {
316
+ t .Fatalf ("Should find saved record" )
317
+ }
318
+
319
+ if err := transaction (ctx , tx , func (ctx context.Context , tx1 * gorm.DB ) error {
320
+ tx1 .Create (& user1 )
321
+
322
+ if err := tx1 .First (& User {}, "name = ?" , user1 .Name ).Error ; err != nil {
323
+ t .Fatalf ("Should find saved record" )
324
+ }
325
+
326
+ if err := transaction (ctx , tx1 , func (ctx context.Context , tx2 * gorm.DB ) error {
327
+ tx2 .Create (& user2 )
328
+
329
+ if err := tx2 .First (& User {}, "name = ?" , user2 .Name ).Error ; err != nil {
330
+ t .Fatalf ("Should find saved record" )
331
+ }
332
+
333
+ return errors .New ("inner rollback" )
334
+ }); err == nil {
335
+ t .Fatalf ("nested transaction has no error" )
336
+ }
337
+
338
+ return errors .New ("rollback" )
339
+ }); err == nil {
340
+ t .Fatalf ("nested transaction should returns error" )
341
+ }
342
+
343
+ if err := tx .First (& User {}, "name = ?" , user1 .Name ).Error ; err == nil {
344
+ t .Fatalf ("Should not find rollbacked record" )
345
+ }
346
+
347
+ if err := tx .First (& User {}, "name = ?" , user2 .Name ).Error ; err != nil {
348
+ t .Fatalf ("Should find saved record" )
349
+ }
350
+ return nil
351
+ }); err != nil {
352
+ t .Fatalf ("no error should return, but got %v" , err )
353
+ }
354
+
355
+ if err := DB .First (& User {}, "name = ?" , user .Name ).Error ; err != nil {
356
+ t .Fatalf ("Should find saved record" )
357
+ }
358
+
359
+ if err := DB .First (& User {}, "name = ?" , user1 .Name ).Error ; err == nil {
360
+ t .Fatalf ("Should not find rollbacked parent record" )
361
+ }
362
+
363
+ if err := DB .First (& User {}, "name = ?" , user2 .Name ).Error ; err != nil {
364
+ t .Fatalf ("Should not find rollbacked nested record" )
365
+ }
366
+ }
367
+
300
368
func TestDisabledNestedTransaction (t * testing.T ) {
301
369
var (
302
370
user = * GetUser ("transaction-nested" , Config {})
0 commit comments