| 1077 | } |
| 1078 | |
| 1079 | func TestTxBeginFuncNestedTransactionCommit(t *testing.T) { |
| 1080 | ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) |
| 1081 | defer cancel() |
| 1082 | |
| 1083 | db, err := pgxpool.New(ctx, os.Getenv("PGX_TEST_DATABASE")) |
| 1084 | require.NoError(t, err) |
| 1085 | defer db.Close() |
| 1086 | |
| 1087 | createSql := ` |
| 1088 | drop table if exists pgxpooltx; |
| 1089 | create temporary table pgxpooltx( |
| 1090 | id integer, |
| 1091 | unique (id) |
| 1092 | ); |
| 1093 | ` |
| 1094 | |
| 1095 | _, err = db.Exec(ctx, createSql) |
| 1096 | require.NoError(t, err) |
| 1097 | |
| 1098 | defer func() { |
| 1099 | db.Exec(ctx, "drop table pgxpooltx") |
| 1100 | }() |
| 1101 | |
| 1102 | err = pgx.BeginFunc(ctx, db, func(db pgx.Tx) error { |
| 1103 | _, err := db.Exec(ctx, "insert into pgxpooltx(id) values (1)") |
| 1104 | require.NoError(t, err) |
| 1105 | |
| 1106 | err = pgx.BeginFunc(ctx, db, func(db pgx.Tx) error { |
| 1107 | _, err := db.Exec(ctx, "insert into pgxpooltx(id) values (2)") |
| 1108 | require.NoError(t, err) |
| 1109 | |
| 1110 | err = pgx.BeginFunc(ctx, db, func(db pgx.Tx) error { |
| 1111 | _, err := db.Exec(ctx, "insert into pgxpooltx(id) values (3)") |
| 1112 | require.NoError(t, err) |
| 1113 | return nil |
| 1114 | }) |
| 1115 | require.NoError(t, err) |
| 1116 | return nil |
| 1117 | }) |
| 1118 | require.NoError(t, err) |
| 1119 | return nil |
| 1120 | }) |
| 1121 | require.NoError(t, err) |
| 1122 | |
| 1123 | var n int64 |
| 1124 | err = db.QueryRow(ctx, "select count(*) from pgxpooltx").Scan(&n) |
| 1125 | require.NoError(t, err) |
| 1126 | require.EqualValues(t, 3, n) |
| 1127 | } |
| 1128 | |
| 1129 | func TestTxBeginFuncNestedTransactionRollback(t *testing.T) { |
| 1130 | ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) |