@@ -1109,7 +1109,7 @@ void VIO_backout(thread_db* tdbb, record_param* rpb, const jrd_tra* transaction)
1109
1109
1110
1110
bool VIO_chase_record_version (thread_db* tdbb, record_param* rpb,
1111
1111
jrd_tra* transaction, MemoryPool* pool,
1112
- bool writelock , bool noundo)
1112
+ RecordLock recordLock , bool noundo)
1113
1113
{
1114
1114
/* *************************************
1115
1115
*
@@ -1258,9 +1258,10 @@ bool VIO_chase_record_version(thread_db* tdbb, record_param* rpb,
1258
1258
// If the transaction is a read committed and chooses the no version
1259
1259
// option, wait for reads also!
1260
1260
1261
- if ((transaction->tra_flags & TRA_read_committed) &&
1261
+ if (recordLock != RecordLock::SKIP &&
1262
+ (transaction->tra_flags & TRA_read_committed) &&
1262
1263
!(transaction->tra_flags & TRA_read_consistency) &&
1263
- (!(transaction->tra_flags & TRA_rec_version) || writelock ))
1264
+ (!(transaction->tra_flags & TRA_rec_version) || recordLock == RecordLock::LOCK ))
1264
1265
{
1265
1266
if (state == tra_limbo)
1266
1267
{
@@ -1975,7 +1976,7 @@ bool VIO_erase(thread_db* tdbb, record_param* rpb, jrd_tra* transaction)
1975
1976
1976
1977
if (rpb->rpb_runtime_flags & (RPB_refetch | RPB_undo_read))
1977
1978
{
1978
- VIO_refetch_record (tdbb, rpb, transaction, false , true );
1979
+ VIO_refetch_record (tdbb, rpb, transaction, RecordLock::NONE , true );
1979
1980
rpb->rpb_runtime_flags &= ~RPB_refetch;
1980
1981
fb_assert (!(rpb->rpb_runtime_flags & RPB_undo_read));
1981
1982
}
@@ -2905,7 +2906,7 @@ bool VIO_get(thread_db* tdbb, record_param* rpb, jrd_tra* transaction, MemoryPoo
2905
2906
const USHORT lock_type = (rpb->rpb_stream_flags & RPB_s_update) ? LCK_write : LCK_read;
2906
2907
2907
2908
if (!DPM_get (tdbb, rpb, lock_type) ||
2908
- !VIO_chase_record_version (tdbb, rpb, transaction, pool, false , false ))
2909
+ !VIO_chase_record_version (tdbb, rpb, transaction, pool, RecordLock::NONE , false ))
2909
2910
{
2910
2911
return false ;
2911
2912
}
@@ -3280,7 +3281,7 @@ bool VIO_modify(thread_db* tdbb, record_param* org_rpb, record_param* new_rpb, j
3280
3281
old_record->copyFrom (org_rpb->rpb_record );
3281
3282
}
3282
3283
3283
- VIO_refetch_record (tdbb, org_rpb, transaction, false , true );
3284
+ VIO_refetch_record (tdbb, org_rpb, transaction, RecordLock::NONE , true );
3284
3285
org_rpb->rpb_runtime_flags &= ~RPB_refetch;
3285
3286
fb_assert (!(org_rpb->rpb_runtime_flags & RPB_undo_read));
3286
3287
@@ -3763,7 +3764,7 @@ bool VIO_next_record(thread_db* tdbb,
3763
3764
{
3764
3765
return false ;
3765
3766
}
3766
- } while (!VIO_chase_record_version (tdbb, rpb, transaction, pool, false , false ));
3767
+ } while (!VIO_chase_record_version (tdbb, rpb, transaction, pool, RecordLock::NONE , false ));
3767
3768
3768
3769
if (rpb->rpb_runtime_flags & RPB_undo_data)
3769
3770
fb_assert (rpb->getWindow (tdbb).win_bdb == NULL );
@@ -3841,7 +3842,7 @@ Record* VIO_record(thread_db* tdbb, record_param* rpb, const Format* format, Mem
3841
3842
3842
3843
3843
3844
bool VIO_refetch_record (thread_db* tdbb, record_param* rpb, jrd_tra* transaction,
3844
- bool writelock , bool noundo)
3845
+ RecordLock recordLock , bool noundo)
3845
3846
{
3846
3847
/* *************************************
3847
3848
*
@@ -3864,9 +3865,9 @@ bool VIO_refetch_record(thread_db* tdbb, record_param* rpb, jrd_tra* transaction
3864
3865
const TraNumber tid_fetch = rpb->rpb_transaction_nr ;
3865
3866
3866
3867
if (!DPM_get (tdbb, rpb, LCK_read) ||
3867
- !VIO_chase_record_version (tdbb, rpb, transaction, tdbb->getDefaultPool (), writelock , noundo))
3868
+ !VIO_chase_record_version (tdbb, rpb, transaction, tdbb->getDefaultPool (), recordLock , noundo))
3868
3869
{
3869
- if (writelock )
3870
+ if (recordLock == RecordLock::LOCK )
3870
3871
return false ;
3871
3872
3872
3873
ERR_post (Arg::Gds (isc_no_cur_rec));
@@ -3890,7 +3891,7 @@ bool VIO_refetch_record(thread_db* tdbb, record_param* rpb, jrd_tra* transaction
3890
3891
// make sure the record has not been updated. Also, punt after
3891
3892
// VIO_data() call which will release the page.
3892
3893
3893
- if (!writelock &&
3894
+ if (recordLock != RecordLock::LOCK &&
3894
3895
(transaction->tra_flags & TRA_read_committed) &&
3895
3896
(tid_fetch != rpb->rpb_transaction_nr ) &&
3896
3897
// added to check that it was not current transaction,
@@ -4486,7 +4487,7 @@ WriteLockResult VIO_writelock(thread_db* tdbb, record_param* org_rpb, jrd_tra* t
4486
4487
4487
4488
if (org_rpb->rpb_runtime_flags & (RPB_refetch | RPB_undo_read))
4488
4489
{
4489
- if (!VIO_refetch_record (tdbb, org_rpb, transaction, true , true ))
4490
+ if (!VIO_refetch_record (tdbb, org_rpb, transaction, (skipLocked ? RecordLock::SKIP : RecordLock::LOCK) , true ))
4490
4491
return WriteLockResult::CONFLICTED;
4491
4492
4492
4493
org_rpb->rpb_runtime_flags &= ~RPB_refetch;
0 commit comments