Skip to content

Commit 45f0a5a

Browse files
authored
Allow isc_tpb_read_consistency to imply read committed (#8746)
* Allow isc_tpb_read_consistency used alone to imply Read Committed Read Consistency * Sync the trace logic with MON$ tables regarding txn isolation, make it more robust to improper set of flags * Restore the original error for isc_tpb_[no_]rec_version version specified without isc_tpb_read_committed
1 parent 5ea7020 commit 45f0a5a

2 files changed

Lines changed: 51 additions & 34 deletions

File tree

src/jrd/tra.cpp

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2929,39 +2929,63 @@ 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+
}
29342944

29352945
if (shared_snapshot)
29362946
{
29372947
ERR_post(
29382948
Arg::Gds(isc_bad_tpb_content) <<
2949+
// 'Option @1 is not valid if @2 was used previously in TPB'
29392950
Arg::Gds(isc_tpb_conflicting_options) <<
29402951
Arg::Str("isc_tpb_consistency") << Arg::Str("isc_tpb_at_snapshot_number"));
29412952
}
29422953

29432954
transaction->tra_flags |= TRA_degree3;
2944-
transaction->tra_flags &= ~TRA_read_committed;
2955+
transaction->tra_flags &= ~(TRA_read_committed | TRA_read_consistency | TRA_rec_version);
29452956
break;
29462957

29472958
case isc_tpb_concurrency:
29482959
if (!isolation.assignOnce(true))
2960+
{
29492961
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
29502962
Arg::Gds(isc_tpb_multiple_txn_isolation));
2963+
}
2964+
2965+
if (read_consistency.isAssigned())
2966+
{
2967+
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
2968+
// 'Option @1 is not valid if @2 was used previously in TPB'
2969+
Arg::Gds(isc_tpb_conflicting_options) <<
2970+
Arg::Str("isc_tpb_concurrency") << Arg::Str("isc_tpb_read_consistency"));
2971+
}
29512972

29522973
transaction->tra_flags &= ~TRA_degree3;
2953-
transaction->tra_flags &= ~TRA_read_committed;
2974+
transaction->tra_flags &= ~(TRA_read_committed | TRA_read_consistency | TRA_rec_version);
29542975
break;
29552976

29562977
case isc_tpb_read_committed:
29572978
if (!isolation.assignOnce(true))
2979+
{
29582980
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
29592981
Arg::Gds(isc_tpb_multiple_txn_isolation));
2982+
}
29602983

29612984
if (shared_snapshot)
29622985
{
29632986
ERR_post(
29642987
Arg::Gds(isc_bad_tpb_content) <<
2988+
// 'Option @1 is not valid if @2 was used previously in TPB'
29652989
Arg::Gds(isc_tpb_conflicting_options) <<
29662990
Arg::Str("isc_tpb_read_committed") << Arg::Str("isc_tpb_at_snapshot_number"));
29672991
}
@@ -3066,14 +3090,16 @@ static void transaction_options(thread_db* tdbb,
30663090

30673091
if (rec_version.isAssigned())
30683092
{
3093+
const auto tpbStr = rec_version.asBool() ?
3094+
"isc_tpb_rec_version" : "isc_tpb_no_rec_version";
3095+
30693096
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
30703097
// 'Option @1 is not valid if @2 was used previously in TPB'
30713098
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")) );
3099+
Arg::Str("isc_tpb_read_consistency") << Arg::Str(tpbStr) );
30743100
}
30753101

3076-
transaction->tra_flags |= TRA_read_consistency | TRA_rec_version;
3102+
transaction->tra_flags |= TRA_read_committed | TRA_read_consistency | TRA_rec_version;
30773103
break;
30783104

30793105
case isc_tpb_nowait:
@@ -3481,22 +3507,19 @@ static void transaction_options(thread_db* tdbb,
34813507

34823508
if (rec_version.isAssigned() && !(transaction->tra_flags & TRA_read_committed))
34833509
{
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-
}
3510+
const auto tpbStr = rec_version.asBool() ?
3511+
"isc_tpb_rec_version" : "isc_tpb_no_rec_version";
3512+
3513+
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
3514+
Arg::Gds(isc_tpb_option_without_rc) << Arg::Str(tpbStr));
34943515
}
34953516

3496-
if ((transaction->tra_flags & TRA_read_committed) && !(tdbb->tdbb_flags & TDBB_sweeper))
3517+
if ((transaction->tra_flags & TRA_read_committed) &&
3518+
!(transaction->tra_flags & TRA_read_consistency) &&
3519+
!(tdbb->tdbb_flags & TDBB_sweeper) &&
3520+
tdbb->getDatabase()->dbb_config->getReadConsistency())
34973521
{
3498-
if (tdbb->getDatabase()->dbb_config->getReadConsistency())
3499-
transaction->tra_flags |= TRA_read_consistency | TRA_rec_version;
3522+
transaction->tra_flags |= TRA_read_consistency | TRA_rec_version;
35003523
}
35013524

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

src/jrd/trace/TraceObjects.cpp

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -210,27 +210,21 @@ int TraceTransactionImpl::getWait()
210210

211211
unsigned TraceTransactionImpl::getIsolation()
212212
{
213-
switch (m_tran->tra_flags & (TRA_read_committed | TRA_rec_version | TRA_degree3 | TRA_read_consistency))
214-
{
215-
case TRA_degree3:
213+
if (m_tran->tra_flags & TRA_degree3)
216214
return ISOLATION_CONSISTENCY;
217215

218-
case TRA_read_committed:
219-
return ISOLATION_READ_COMMITTED_NORECVER;
220-
221-
case TRA_read_committed | TRA_rec_version:
222-
return ISOLATION_READ_COMMITTED_RECVER;
223-
224-
case TRA_read_committed | TRA_rec_version | TRA_read_consistency:
225-
return ISOLATION_READ_COMMITTED_READ_CONSISTENCY;
216+
if (m_tran->tra_flags & TRA_read_committed)
217+
{
218+
if (m_tran->tra_flags & TRA_read_consistency)
219+
return ISOLATION_READ_COMMITTED_READ_CONSISTENCY;
226220

227-
case 0:
228-
return ISOLATION_CONCURRENCY;
221+
if (m_tran->tra_flags & TRA_rec_version)
222+
return ISOLATION_READ_COMMITTED_RECVER;
229223

230-
default:
231-
fb_assert(false);
232-
return ISOLATION_CONCURRENCY;
224+
return ISOLATION_READ_COMMITTED_NORECVER;
233225
}
226+
227+
return ISOLATION_CONCURRENCY;
234228
}
235229

236230
ISC_INT64 TraceTransactionImpl::getInitialID()

0 commit comments

Comments
 (0)