On 05-Mar-2015 10:06 -0600, Charles Wilt wrote:
Been looking into a issue and thought I had a handle on it.
Till I realized for certain records, I don't see an update entry in
the journal as I expected.
Back to the code...after spending a an hour or so looking. I really
can't see how the UPDATE wouldn't have have been hit.
Then it hits me, for a few records, none of the values in the fields
of the file would have actually changed between READ and UPDATE.
IIRC, RPG by design won't actually do an update unless the buffer's
changed.
On 05-Mar-2015 11:15 -0600, Charles Wilt wrote:
...I realized it probably should have been "RPG (or the DB)"...
In other words:
read myfile;
wFld1 = fFld1;
wFld2 = fFld2;
fFld1 = wFld1;
fFld2 = wFld2;
update myfileR;
Wouldn't actually update the record in myfile.
Can anyone confirm that I'm not misremembering?
None of the HLL [e.g. RPG] run-time, the DM, nor even the OS DB could
appropriately dismiss an UPDATE operation that was coded in the HLL,
based solely on an equivalence determined between the /buffer/ before
the update and the /buffer/ after the changes applied to the buffer.
While the programmer has the option of coding a bypass of the UPDATE
within their program, the onus is on the programmer to decide whether
that [in]action is proper, in accordance with the definitions of their
application and database; notably the business rules, which esp. if
defined in the database, may depend on the program *not* coding to
avoid\omit the presumed-redundant request.
FWiW the interface to the UPDATE, via the DM, does not provide any
storage [to the HLL] for both a pre-update copy of the record and the
actual record within the provide buffer-storage. There is only one copy
of the record that is made available via the buffer provided by the DM.
The changes to the /record/ in the HLL are applied directly to that
buffer, and then the UPDATE operation uses the data in that buffer to
pass down to the database.
Any interface from the HLL down to the DB that might choose to make a
pre-update copy of the record in order to attempt such a comparison and
avoid the UPDATE if equivalent, would be a flawed interface. That is
because the DataBase is the arbiter of the I\O. Interfaces above the DB
would not easily be able to predict that the effect from the UPDATE
without any /perceived/ data changes, might actually effect physical
data changes, irrespective their [possibly false] conclusion such a
request would be redundant. Again, the programmer\application could
/know/ that coding the bypass was acceptable, but the HLL itself must
not presume the operation can be bypassed solely due to apparent redundancy.
At least some of the following may result in an effect whereby
physical changes will be visible, despite apparent equivalence of
pre-update and post-update buffers as compared immediately prior to the
UPDATE; the last item is presumably a means to ensure that even for an
apparent-equivalence scenario, the UPDATE should effect a change to the
physical data:
• [instead of] triggers
• with check option
• fieldproc
• row change timestamp
The lack of a journal entry being deposited for an UPDATE [that was
passed from the HLL via the DM to the OS DB and then down to the LIC DB]
is the domain of the LIC Journal feature:
<
http://www.ibm.com/support/knowledgecenter/api/content/ssw_ibm_i_71/rzaki/rzakihowwrks.htm>
_How journal management works_
"...
_Journal receivers_
The system writes entries to an object called a journal receiver.
...
... If the updated physical file image after the update is the same as
the image before the update, and if the file has no variable length
fields, then journal entries are not deposited for that update. If the
updated data area image after the update is the same as the image before
the update, then journal entries are not deposited for that update. If
the attribute that was requested to be changed was already that value,
then journal entries are not deposited for that change.
..."
As an Amazon Associate we earn from qualifying purchases.