Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Row lock with for update

SB35Jul 1 2021

Its version 19.9.0.0.0 of oracle exadata. We are seeing below application query which used to run around ~200-300 times in an hour and was used to take ~.5 sec/execution. But then after it started executing ~1000 times/hour and the execution time went up to ~3 to ~4 seconds/execution flooding the whole database with "row lock contention' application waits.
It seems this statement is taking a lock and doing some processing at the same time waiting for 20 seconds if not getting a lock. And the row lock contention appears when lot of sessions submitted doing same functionality and fighting with each other. So wanted to know, how should we fix such issue? Should we make it as NOWAIT and let the session skip that process when one is already working? or should we minimize the WAIT from 20 to ~10?
SELECT ID FROM LOCK_TAB WHERE LOCK_NAME = 'XXXX' FOR UPDATE OF ID WAIT 20

This post has been answered by Jonathan Lewis on Jul 5 2021
Jump to Answer

Comments

Solomon Yakobson
with t as (
           select  date_start + offset dt
             from  get_dates,
                   lateral(
                           select  level - 1 offset
                             from  dual
                             connect by level <= date_end - date_start + 1
                          )
          )
select  case grouping(to_char(dt,'mm')) when 1 then to_char(dt,'yyyy') || ' Total' end year,
        to_char(dt,'mm') month,
        sum(case dt - trunc(dt,'iw') when 5 then 1 end) saturday,
        sum(case dt - trunc(dt,'iw') when 6 then 1 end) sunday,
        sum(case dt - trunc(dt,'iw') when 0 then 1 end) monday,
        sum(case dt - trunc(dt,'iw') when 1 then 1 end) tuesday,
        sum(case dt - trunc(dt,'iw') when 2 then 1 end) wednesday,
        sum(case dt - trunc(dt,'iw') when 3 then 1 end) thursday,
        sum(case dt - trunc(dt,'iw') when 4 then 1 end) friday,
        count(*) grand_total
  from  t
  group by grouping sets((to_char(dt,'yyyy')),(to_char(dt,'yyyy'),to_char(dt,'mm')))
  order by to_char(dt,'yyyy'),
           to_char(dt,'mm')
/

YEAR       MO   SATURDAY     SUNDAY     MONDAY    TUESDAY  WEDNESDAY   THURSDAY     FRIDAY GRAND_TOTAL
---------- -- ---------- ---------- ---------- ---------- ---------- ---------- ---------- -----------
           05          3          3          3          3          3          3          3          21
           06                     1          1          1          1                                 4
2014 Total             3          4          4          4          4          3          3          25
           01          1          2          2          2          1          1          1          10
           02          4          4          4          4          4          4          4          28
           03          3          3          3          3          4          3          3          22
2017 Total             8          9          9          9          9          8          8          60


7 rows selected.


SQL>

SY.

Shaik_Muhammad
Answer

Yes Sir, you suggested me to post in this forum, ..

  1. This forum is for discussion of the use of the SQL Developer GUI tool. Your question is purely a SQL question. Better asked at https://community.oracle.com/tech/developers/categories/3063-general_questions1
    Am testing code suggested by Mr. Soloman..
Marked as Answer by Shaik_Muhammad · Jun 8 2021
EdStevens

Yes Sir, you suggested me to post in this forum, ..
Ah, so I did. Mea culpa.

Shaik_Muhammad

Thanks for the reply.
We are using 11g database.
Attached is the query execution output.
query_execution.jpg (67.13 KB)

Solomon Yakobson

Next time provide version upfront, expecially when you are on very old version:

with t as (
           select  date_start + level - 1 dt
             from  get_dates
             connect by rowid = prior rowid
                    and level <= date_end - date_start + 1
                    and prior sys_guid() is not null
          )
select  case grouping(to_char(dt,'mm')) when 1 then to_char(dt,'yyyy') || ' Total' end year,
        to_char(dt,'mm') month,
        sum(case dt - trunc(dt,'iw') when 5 then 1 end) saturday,
        sum(case dt - trunc(dt,'iw') when 6 then 1 end) sunday,
        sum(case dt - trunc(dt,'iw') when 0 then 1 end) monday,
        sum(case dt - trunc(dt,'iw') when 1 then 1 end) tuesday,
        sum(case dt - trunc(dt,'iw') when 2 then 1 end) wednesday,
        sum(case dt - trunc(dt,'iw') when 3 then 1 end) thursday,
        sum(case dt - trunc(dt,'iw') when 4 then 1 end) friday,
        count(*) grand_total
  from  t
  group by grouping sets((to_char(dt,'yyyy')),(to_char(dt,'yyyy'),to_char(dt,'mm')))
  order by to_char(dt,'yyyy'),
           to_char(dt,'mm')
/


YEAR       MONTH   SATURDAY     SUNDAY     MONDAY    TUESDAY  WEDNESDAY   THURSDAY     FRIDAY GRAND_TOTAL
---------- ----- ---------- ---------- ---------- ---------- ---------- ---------- ---------- -----------
           05             3          3          3          3          3          3          3          21
           06                        1          1          1          1                                 4
2014 Total                3          4          4          4          4          3          3          25
           01             1          2          2          2          1          1          1          10
           02             4          4          4          4          4          4          4          28
           03             3          3          3          3          4          3          3          22
2017 Total                8          9          9          9          9          8          8          60


7 rows selected.


SQL>

SY.

Shaik_Muhammad

Many Thanks to you Mr. Solomon Yakobson Sir, Mr. EdSteven Sir, report working perfectly.

1 - 7

Post Details

Added on Jul 1 2021
28 comments
4,559 views