I'm inserting a row using an Oracle stored procedure which is configured to use an autonomous transaction. I'd like to insert this record, commit that transaction, and then lock the newly-inserted record so that nobody else can modify it except my current session (in another transaction, obviously, since the one that inserted it is autonomous).
How can I ensure that nobody else gets a lock on this new record before I have a chance to SELECT...FOR UPDATE
it?
Using Oracle 10g.
To make it so that nobody can read from the table while you're inserting: insert into LargeTable with (tablockx) ... You don't have to do anything to make the table look empty until after the insert completes.
For example, if you want to lock Rows 1 through 5, select Row 6. Then, select the "View" tab, and click on the "Freeze Panes" option.
No, you can never maintain a lock between transactions. The question you should be asking yourself is why you need to issue the commit between the insert
and the select ... for update
. The row is locked by the insert
; if you finish whatever it is that you're doing with that row before you commit, then you don't have to worry about re-locking the row.
My first preference would be to remove the COMMIT until the data is ready for use by other sessions.
Alternatively, you could design your application in such a way as to make sure the new row only gets locked by that transaction.
Add a flag to the table, e.g. VISIBLE
, default 'N'
.
When you insert a row, insert it with the default value.
After the commit, select
it for update
, and update the flag to 'Y'
(so that when your code commits the second time, it will update the flag as well).
Modify your application so that other sessions will ignore rows where VISIBLE='N'
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With