dbTalk Databases Forums  

Q: forcing failures when rows are locked.

comp.databases.oracle.misc comp.databases.oracle.misc


Discuss Q: forcing failures when rows are locked. in the comp.databases.oracle.misc forum.



Reply
 
Thread Tools Display Modes
  #11  
Old   
Dan Blum
 
Posts: n/a

Default Re: Q: forcing failures when rows are locked. - 05-24-2008 , 01:55 PM






Malcolm Dew-Jones <yf110 (AT) vtn1 (DOT) victoria.tc.ca> wrote:
Quote:
"Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit
Production

Quote:
In one session I lock a row
begin
select the_ID, COMMENT_TXT into :id,:txt
from the_table
where the_id = 1234
for update nowait ;
end;
/

In a second session I try to update the same row.

update the_table set comment_txt = 'new comment'
where the_id = 1234;

The second session hangs, until the first session commits or rolls back;
Same thing happens with delete, (and presumably any other operations that
would alter that row).

On the other hand, if the second session tries to lock the row then it
gets the error

ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified
ORA-06512: at line 2

Quote:
What I want is for the second session to "automatically" get that error
for all operations, (i.e. delete and update with no special options in the
command) not just in "select for update"

Ideally I could set that at the start of a section of code, and then
restore what ever the original default behaviour was afterwards.

But how to do any of that?
alter session set isolation_level = serializable

will do something much like what you want (it works at the transaction level,
not the statement level). You should test a bunch of scenarios to make sure
you understand the behavior.

--
__________________________________________________ _____________________
Dan Blum tool (AT) panix (DOT) com
"I wouldn't have believed it myself if I hadn't just made it up."


Reply With Quote
  #12  
Old   
Dan Blum
 
Posts: n/a

Default Re: Q: forcing failures when rows are locked. - 05-24-2008 , 01:55 PM






Malcolm Dew-Jones <yf110 (AT) vtn1 (DOT) victoria.tc.ca> wrote:
Quote:
"Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit
Production

Quote:
In one session I lock a row
begin
select the_ID, COMMENT_TXT into :id,:txt
from the_table
where the_id = 1234
for update nowait ;
end;
/

In a second session I try to update the same row.

update the_table set comment_txt = 'new comment'
where the_id = 1234;

The second session hangs, until the first session commits or rolls back;
Same thing happens with delete, (and presumably any other operations that
would alter that row).

On the other hand, if the second session tries to lock the row then it
gets the error

ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified
ORA-06512: at line 2

Quote:
What I want is for the second session to "automatically" get that error
for all operations, (i.e. delete and update with no special options in the
command) not just in "select for update"

Ideally I could set that at the start of a section of code, and then
restore what ever the original default behaviour was afterwards.

But how to do any of that?
alter session set isolation_level = serializable

will do something much like what you want (it works at the transaction level,
not the statement level). You should test a bunch of scenarios to make sure
you understand the behavior.

--
__________________________________________________ _____________________
Dan Blum tool (AT) panix (DOT) com
"I wouldn't have believed it myself if I hadn't just made it up."


Reply With Quote
  #13  
Old   
Dan Blum
 
Posts: n/a

Default Re: Q: forcing failures when rows are locked. - 05-24-2008 , 01:55 PM



Malcolm Dew-Jones <yf110 (AT) vtn1 (DOT) victoria.tc.ca> wrote:
Quote:
"Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit
Production

Quote:
In one session I lock a row
begin
select the_ID, COMMENT_TXT into :id,:txt
from the_table
where the_id = 1234
for update nowait ;
end;
/

In a second session I try to update the same row.

update the_table set comment_txt = 'new comment'
where the_id = 1234;

The second session hangs, until the first session commits or rolls back;
Same thing happens with delete, (and presumably any other operations that
would alter that row).

On the other hand, if the second session tries to lock the row then it
gets the error

ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified
ORA-06512: at line 2

Quote:
What I want is for the second session to "automatically" get that error
for all operations, (i.e. delete and update with no special options in the
command) not just in "select for update"

Ideally I could set that at the start of a section of code, and then
restore what ever the original default behaviour was afterwards.

But how to do any of that?
alter session set isolation_level = serializable

will do something much like what you want (it works at the transaction level,
not the statement level). You should test a bunch of scenarios to make sure
you understand the behavior.

--
__________________________________________________ _____________________
Dan Blum tool (AT) panix (DOT) com
"I wouldn't have believed it myself if I hadn't just made it up."


Reply With Quote
  #14  
Old   
Malcolm Dew-Jones
 
Posts: n/a

Default Re: Q: forcing failures when rows are locked. - 06-02-2008 , 04:48 PM



Malcolm Dew-Jones (yf110 (AT) vtn1 (DOT) victoria.tc.ca) wrote:
: "Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit
: Production


: In one session I lock a row
: begin
: select the_ID, COMMENT_TXT into :id,:txt
: from the_table
: where the_id = 1234
: for update nowait ;
: end;
: /

: In a second session I try to update the same row.

: update the_table set comment_txt = 'new comment'
: where the_id = 1234;

: The second session hangs, until the first session commits or rolls back;
: Same thing happens with delete, (and presumably any other operations that
: would alter that row).

: On the other hand, if the second session tries to lock the row then it
: gets the error

: ERROR at line 1:
: ORA-00054: resource busy and acquire with NOWAIT specified
: ORA-06512: at line 2


: What I want is for the second session to "automatically" get that error
: for all operations, (i.e. delete and update with no special options in the
: command) not just in "select for update"


I did not correctly appreciate that the nowait could lock an arbitrary set
of rows all at once.

for rec in
( select the_ID, COMMENT_TXT
from the_table
where -condition-matching-numerous-rows-
for update nowait
)
loop
exit ;
end loop;

If we get here then _all_ the rows are now locked. Otherwise we
would have got the -54 error.

The admin can now use any other SQL command (that targets those
rows) with no unexpected delays, and all the FORMS users are
locked out of exactly those rows the admin is targetting for the
mass update.



Reply With Quote
  #15  
Old   
Malcolm Dew-Jones
 
Posts: n/a

Default Re: Q: forcing failures when rows are locked. - 06-02-2008 , 04:48 PM



Malcolm Dew-Jones (yf110 (AT) vtn1 (DOT) victoria.tc.ca) wrote:
: "Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit
: Production


: In one session I lock a row
: begin
: select the_ID, COMMENT_TXT into :id,:txt
: from the_table
: where the_id = 1234
: for update nowait ;
: end;
: /

: In a second session I try to update the same row.

: update the_table set comment_txt = 'new comment'
: where the_id = 1234;

: The second session hangs, until the first session commits or rolls back;
: Same thing happens with delete, (and presumably any other operations that
: would alter that row).

: On the other hand, if the second session tries to lock the row then it
: gets the error

: ERROR at line 1:
: ORA-00054: resource busy and acquire with NOWAIT specified
: ORA-06512: at line 2


: What I want is for the second session to "automatically" get that error
: for all operations, (i.e. delete and update with no special options in the
: command) not just in "select for update"


I did not correctly appreciate that the nowait could lock an arbitrary set
of rows all at once.

for rec in
( select the_ID, COMMENT_TXT
from the_table
where -condition-matching-numerous-rows-
for update nowait
)
loop
exit ;
end loop;

If we get here then _all_ the rows are now locked. Otherwise we
would have got the -54 error.

The admin can now use any other SQL command (that targets those
rows) with no unexpected delays, and all the FORMS users are
locked out of exactly those rows the admin is targetting for the
mass update.



Reply With Quote
  #16  
Old   
Malcolm Dew-Jones
 
Posts: n/a

Default Re: Q: forcing failures when rows are locked. - 06-02-2008 , 04:48 PM



Malcolm Dew-Jones (yf110 (AT) vtn1 (DOT) victoria.tc.ca) wrote:
: "Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit
: Production


: In one session I lock a row
: begin
: select the_ID, COMMENT_TXT into :id,:txt
: from the_table
: where the_id = 1234
: for update nowait ;
: end;
: /

: In a second session I try to update the same row.

: update the_table set comment_txt = 'new comment'
: where the_id = 1234;

: The second session hangs, until the first session commits or rolls back;
: Same thing happens with delete, (and presumably any other operations that
: would alter that row).

: On the other hand, if the second session tries to lock the row then it
: gets the error

: ERROR at line 1:
: ORA-00054: resource busy and acquire with NOWAIT specified
: ORA-06512: at line 2


: What I want is for the second session to "automatically" get that error
: for all operations, (i.e. delete and update with no special options in the
: command) not just in "select for update"


I did not correctly appreciate that the nowait could lock an arbitrary set
of rows all at once.

for rec in
( select the_ID, COMMENT_TXT
from the_table
where -condition-matching-numerous-rows-
for update nowait
)
loop
exit ;
end loop;

If we get here then _all_ the rows are now locked. Otherwise we
would have got the -54 error.

The admin can now use any other SQL command (that targets those
rows) with no unexpected delays, and all the FORMS users are
locked out of exactly those rows the admin is targetting for the
mass update.



Reply With Quote
  #17  
Old   
Malcolm Dew-Jones
 
Posts: n/a

Default Re: Q: forcing failures when rows are locked. - 06-02-2008 , 04:48 PM



Malcolm Dew-Jones (yf110 (AT) vtn1 (DOT) victoria.tc.ca) wrote:
: "Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit
: Production


: In one session I lock a row
: begin
: select the_ID, COMMENT_TXT into :id,:txt
: from the_table
: where the_id = 1234
: for update nowait ;
: end;
: /

: In a second session I try to update the same row.

: update the_table set comment_txt = 'new comment'
: where the_id = 1234;

: The second session hangs, until the first session commits or rolls back;
: Same thing happens with delete, (and presumably any other operations that
: would alter that row).

: On the other hand, if the second session tries to lock the row then it
: gets the error

: ERROR at line 1:
: ORA-00054: resource busy and acquire with NOWAIT specified
: ORA-06512: at line 2


: What I want is for the second session to "automatically" get that error
: for all operations, (i.e. delete and update with no special options in the
: command) not just in "select for update"


I did not correctly appreciate that the nowait could lock an arbitrary set
of rows all at once.

for rec in
( select the_ID, COMMENT_TXT
from the_table
where -condition-matching-numerous-rows-
for update nowait
)
loop
exit ;
end loop;

If we get here then _all_ the rows are now locked. Otherwise we
would have got the -54 error.

The admin can now use any other SQL command (that targets those
rows) with no unexpected delays, and all the FORMS users are
locked out of exactly those rows the admin is targetting for the
mass update.



Reply With Quote
Reply




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off



Powered by vBulletin Version 3.5.3
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.