Skip to content

Commit e5f6ec1

Browse files
committed
Allow isc_tpb_read_consistency used alone to imply Read Committed Read Consistency
1 parent 721329f commit e5f6ec1

File tree

1 file changed

+58
-22
lines changed

1 file changed

+58
-22
lines changed

src/jrd/tra.cpp

Lines changed: 58 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2929,39 +2929,85 @@ static void transaction_options(thread_db* tdbb,
29292929
{
29302930
case isc_tpb_consistency:
29312931
if (!isolation.assignOnce(true))
2932+
{
29322933
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
29332934
Arg::Gds(isc_tpb_multiple_txn_isolation));
2935+
}
2936+
2937+
if (read_consistency.isAssigned())
2938+
{
2939+
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
2940+
// 'Option @1 is not valid if @2 was used previously in TPB'
2941+
Arg::Gds(isc_tpb_conflicting_options) <<
2942+
Arg::Str("isc_tpb_consistency") << Arg::Str("isc_tpb_read_consistency"));
2943+
}
2944+
2945+
if (rec_version.isAssigned())
2946+
{
2947+
const auto tpbStr = rec_version.asBool() ?
2948+
"isc_tpb_rec_version" : "isc_tpb_no_rec_version";
2949+
2950+
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
2951+
// 'Option @1 is not valid if @2 was used previously in TPB'
2952+
Arg::Gds(isc_tpb_conflicting_options) <<
2953+
Arg::Str("isc_tpb_consistency") << Arg::Str(tpbStr) );
2954+
}
29342955

29352956
if (shared_snapshot)
29362957
{
29372958
ERR_post(
29382959
Arg::Gds(isc_bad_tpb_content) <<
2960+
// 'Option @1 is not valid if @2 was used previously in TPB'
29392961
Arg::Gds(isc_tpb_conflicting_options) <<
29402962
Arg::Str("isc_tpb_consistency") << Arg::Str("isc_tpb_at_snapshot_number"));
29412963
}
29422964

29432965
transaction->tra_flags |= TRA_degree3;
2944-
transaction->tra_flags &= ~TRA_read_committed;
2966+
transaction->tra_flags &= ~(TRA_read_committed | TRA_read_consistency | TRA_rec_version);
29452967
break;
29462968

29472969
case isc_tpb_concurrency:
29482970
if (!isolation.assignOnce(true))
2971+
{
29492972
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
29502973
Arg::Gds(isc_tpb_multiple_txn_isolation));
2974+
}
2975+
2976+
if (read_consistency.isAssigned())
2977+
{
2978+
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
2979+
// 'Option @1 is not valid if @2 was used previously in TPB'
2980+
Arg::Gds(isc_tpb_conflicting_options) <<
2981+
Arg::Str("isc_tpb_concurrency") << Arg::Str("isc_tpb_read_consistency"));
2982+
}
2983+
2984+
if (rec_version.isAssigned())
2985+
{
2986+
const auto tpbStr = rec_version.asBool() ?
2987+
"isc_tpb_rec_version" : "isc_tpb_no_rec_version";
2988+
2989+
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
2990+
// 'Option @1 is not valid if @2 was used previously in TPB'
2991+
Arg::Gds(isc_tpb_conflicting_options) <<
2992+
Arg::Str("isc_tpb_concurrency") << Arg::Str(tpbStr) );
2993+
}
29512994

29522995
transaction->tra_flags &= ~TRA_degree3;
2953-
transaction->tra_flags &= ~TRA_read_committed;
2996+
transaction->tra_flags &= ~(TRA_read_committed | TRA_read_consistency | TRA_rec_version);
29542997
break;
29552998

29562999
case isc_tpb_read_committed:
29573000
if (!isolation.assignOnce(true))
3001+
{
29583002
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
29593003
Arg::Gds(isc_tpb_multiple_txn_isolation));
3004+
}
29603005

29613006
if (shared_snapshot)
29623007
{
29633008
ERR_post(
29643009
Arg::Gds(isc_bad_tpb_content) <<
3010+
// 'Option @1 is not valid if @2 was used previously in TPB'
29653011
Arg::Gds(isc_tpb_conflicting_options) <<
29663012
Arg::Str("isc_tpb_read_committed") << Arg::Str("isc_tpb_at_snapshot_number"));
29673013
}
@@ -3066,14 +3112,16 @@ static void transaction_options(thread_db* tdbb,
30663112

30673113
if (rec_version.isAssigned())
30683114
{
3115+
const auto tpbStr = rec_version.asBool() ?
3116+
"isc_tpb_rec_version" : "isc_tpb_no_rec_version";
3117+
30693118
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
30703119
// 'Option @1 is not valid if @2 was used previously in TPB'
30713120
Arg::Gds(isc_tpb_conflicting_options) <<
3072-
Arg::Str("isc_tpb_read_consistency") << (rec_version.asBool() ?
3073-
Arg::Str("isc_tpb_rec_version") : Arg::Str("isc_tpb_no_rec_version")) );
3121+
Arg::Str("isc_tpb_read_consistency") << Arg::Str(tpbStr) );
30743122
}
30753123

3076-
transaction->tra_flags |= TRA_read_consistency | TRA_rec_version;
3124+
transaction->tra_flags |= TRA_read_committed | TRA_read_consistency | TRA_rec_version;
30773125
break;
30783126

30793127
case isc_tpb_nowait:
@@ -3479,24 +3527,12 @@ static void transaction_options(thread_db* tdbb,
34793527
}
34803528
}
34813529

3482-
if (rec_version.isAssigned() && !(transaction->tra_flags & TRA_read_committed))
3483-
{
3484-
if (rec_version.asBool())
3485-
{
3486-
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
3487-
Arg::Gds(isc_tpb_option_without_rc) << Arg::Str("isc_tpb_rec_version"));
3488-
}
3489-
else
3490-
{
3491-
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
3492-
Arg::Gds(isc_tpb_option_without_rc) << Arg::Str("isc_tpb_no_rec_version"));
3493-
}
3494-
}
3495-
3496-
if ((transaction->tra_flags & TRA_read_committed) && !(tdbb->tdbb_flags & TDBB_sweeper))
3530+
if ((transaction->tra_flags & TRA_read_committed) &&
3531+
!(transaction->tra_flags & TRA_read_consistency) &&
3532+
!(tdbb->tdbb_flags & TDBB_sweeper) &&
3533+
tdbb->getDatabase()->dbb_config->getReadConsistency())
34973534
{
3498-
if (tdbb->getDatabase()->dbb_config->getReadConsistency())
3499-
transaction->tra_flags |= TRA_read_consistency | TRA_rec_version;
3535+
transaction->tra_flags |= TRA_read_consistency | TRA_rec_version;
35003536
}
35013537

35023538
if (transaction->tra_attachment->isGbak())

0 commit comments

Comments
 (0)