Heavy row lock contention
Guys,
I really appreciate your views on this.. Please can some one who have worked on RAC and have an understanding how RAC works, guide me.
We currently are running a loadtest on one of the new RAC system and we are seeing excessive row lock contention for one table. The table basically has very few rows, say about 6-8 and pretty much every user uses this table to lock rows before fetching some data from other tables. When have a heavy load, we see very high wait on this table and enq TX : Row lock contention.
What is the best way to avoid this ? Is there anyway, we can modify the design of the application and ensure locking.. The typical query that locks the rows in the table looks like this
SELECT WL0.CLUB_NAME, WL0.SCHEDULE_ID FROM VF_BINGO_NEXT_CLUB_DRAW WL0 WHERE ( WL0.CLUB_NAME = :1 ) FOR UPDATE As said, they table has only 6-8 rows, so query plan etc doesn't apply. Please can someone who have extensive application knowledge guide me thru ?
Many thanks in advance.
G
> But is there a way to alliviate the concurrency issue, if there is a genuine
requirement to hold lock on a table. What other options do we have other
than locking ?
The purpose of a lock is to ensure data consistency - only 1 process can change that row. So what I find puzzling is why so many app sessions want to change that single row. What data does that row hold that requires continual change? Just what is the purpose of this data if it is consistently and continually changing? What business requirement does it attempt to solve?
To be honest, this sounds like a major design problem to me.
Like the surrogate key generator approach I mentioned. You create a PK_SEQUENCE table with columns (tablename, pk_value). Any insert against a table requires a lock on PK_SEQUENCE for the table being inserted into - a read of the PK_VALUE, incrementing it by one and then updating that row with the latest sequence. This way each INSERT gets a "nice sequential number" to use as surrogate key for new rows.
Even when this is done as an autonomous transaction, it introduces a very expensive resource - why? Because only one session at a time can be serviced by that resource.
If there are a lot of INSERTs into a table, this approach will quickly become a severe bottleneck as every single insert requires a new surrogate key value and a lock on that PK_SEQUENCE table to obtain that value.
This problem is solved by allowing/enabling such a resource to serve multiple sessions concurrently. Which is for example what Oracle Sequence objects do within this example I've described.
The bottom line is that the design you describe introduced a bottleneck by create an expensive and serialised resource that can only serve a single session at a time.
You need to re-look at the business requirement - and find another way to solve it than to introduce this type of serialised resource and contention.
Similar Messages
-
Tuning row lock contention wait events
Hello everyone,
Working on 10g/windows
Top 5 events
EVENT TOTAL_WAITS TIME_WAITED AVG_MS PERCENT
CPU 9462339 48
enq: TX - row lock contention 12531 3660728 2921.34 18
control file parallel write 1300731 3088079 23.74 16
log file parallel write 1510503 1264080 8.37 6
log file sync 1072553 968007 9.03 5
Distribution of row lock wait during the last 4 days in the database server
END_INTERVAL_TIME TOTAL_WAITS TIME_WAITED_MICRO AVG_WAIT_MS
2008-04-01 16:00:58 909 2721008230 2993.41
2008-04-01 15:00:27 50 149941140 2998.82
2008-03-31 12:00:42 193 575595397 2982.36
2008-03-29 23:00:13 172 513058700 2982.9
2008-03-29 22:00:37 164 483940046 2950.85
2008-03-27 22:00:35 565 1667120838 2950.66
2008-03-26 18:00:59 348 1042918982 2996.89
My analysis:
It's obvious that the row lock contention wait time is huge, and this direct me to find out SQL stmt, causing this.
all the SQL statement was SELECT ....... FOR UPDATE stmt.
I was also able to find out locked tables.
My tuning idea:
1. I'm thinking to reorganize hot tables as well as their indexes, but by instinct it seems to not give so much value to avoid the huge row lock wait time.
2. I'm also seeing if I can reduce the number of rows per block, by increasing PCTFREE and diminishing PCTUSED, so the contention will spread over many blocks instead of one heavy block.
Question
As SQL stmt related to those locked tables are select ... for update, how could I tune this kind of stmt?
Does someone have other idea to come up with this row lock contention?
Tanks for your effort and helpTaking another look at your suggested function based index, it depends on the data type of the DEV.POS_FOLIO_ID.POS_FOLIO_ID column. If the column is defined as a number, and it is a primary key, there will already be a usable index on that column.
Yesterday, I wrote this: "Once I understood why or how the sessions were trying to insert duplicate primary key values, I would try to determine why the average number of seconds for the wait event is almost 3 seconds (maybe a timeout)."
After fixing the formatting of the top 5 wait events (total duration unknown):
EVENT TOTAL_WAITS TIME_WAITED AVG_MS PERCENT
CPU 94,623.39 48
enq: TX - row lock contention 12,531 36,607.28 2921.34 18
control file parallel write 1,300,731 30,880.79 23.74 16
log file parallel write 1,510,503 12,640.80 8.37 6
log file sync 1,072,553 9,680.07 9.03 512,531 * 3 second time out = 37,593 seconds = 10.44 hours.
What if the reason for the 3 second average wait time is due to a timeout. I performed a little experiment... I changed a row in a test table and then made a pot of coffee.
In session 1:
CREATE TABLE T1 (
C1 NUMBER(10),
C2 NUMBER(10),
PRIMARY KEY (C1));
INSERT INTO T1
SELECT
ROWNUM,
ROWNUM*10
FROM
DUAL
CONNECT BY
LEVEL<=1000000;
COMMIT;I now have a test table with 1,000,000 rows. I start monitoring the changes in the wait events roughly every 60 seconds, and V$SESSION_WAIT and V$LOCK roughly 4 times per second.
Back in session 1:
UPDATE
T1
SET
C1=-C1
WHERE
C1<=100;I have now modified the first 100 rows that were inserted into the table, time to make the pot of coffee.
In session 2, I try to insert a row with a primary key value of -10:
INSERT INTO T1 VALUES (
-10,
10);Session 2 hangs.
If I take the third 60 second snap of the system wide wait events as the zero point, and the 11th snap as the end point. There were 149 waits on ENQ: TX - ROW LOCK CONTENTION, 148 time outs, 446.62 seconds of total time in the wait event, with an average wait time of 2.997450 seconds.
Rolling down to the session level wait events, SID 208 (my session 2) had 149 waits on ENQ: TX - ROW LOCK CONTENTION, for a total time of 446.61 seconds with an average wait time of 2.997383 seconds. All of the 149 waits and the wait time was in this one session that was locked up for the full duration of this time period because session 1 was making a pot of coffee.
Rolling down to V$SESSION_WAIT (sampled roughly 4 times per second): At the start of the third time interval, SID 208 has been in the ENQ: TX - ROW LOCK CONTENTION wait event for 39 seconds and is actively waiting trying to execute SQL with a hash value of 1001532423, the wait object is -1, wait file is 0, wait block is 0, wait row is 0, P1 is 1415053316, P2 is 196646, P3 is 4754.
At the end of the 11th time interval: , SID 208 has been in the ENQ: TX - ROW LOCK CONTENTION wait event for 483 seconds and is actively waiting trying to execute SQL with a hash value of 1001532423, the wait object is -1, wait file is 0, wait block is 0, wait row is 0, P1 is 1415053316, P2 is 196646, P3 is 4754.
Rolling down to V$LOCK (sampled roughly 4 times per second): I see that SID 214 (session 1) is blocking SID 208 (session 2). SID 214 has a TX lock in mode 6 with ID1 of 196646 and ID2 of 4754. SID 208 is requesting a TX lock in mode 4 with ID1 of 196646 and ID2 of 4754.
So, it seems that I need a faster coffee pot rather than an additional index on my table. It could be that the above process would have found that the application associated with SID 214 was abandoned or crashed and for some reason the lock was not released for a long period of time, a little less than 10.44 hours in your case.
Charles Hooper
IT Manager/Oracle DBA
K&M Machine-Fabricating, Inc. -
Row lock contention on WWV_FLOW_DATA
I'm hosting an APEX app on one of my Oracle servers
Oracle 10.1.0.4.0
APEX 3.0.0
The users (and APEX developer) are complaining about slow performance. One of the primary reasons seems to be as a result of row lock contention. And as this is on an APEX table, I think it is fair to think that this is not a finger-up-nose mistake from the APEX developer.
This is what I for example just saw some minutes ago. 3 APEX sessions running for application 103 and page 1 according to V$SESSION.
Wait status for all 3 sessions (ticking over into many minutes) is:
enq: TX - row lock contention
The one session shows this SQL:
INSERT INTO WWV_FLOW_DATA ( FLOW_INSTANCE, ITEM_ID, ITEM_VALUE )
VALUES ( :B4 , :B3 , :B2 ||':'||:B1 ||':0:0')
The other two sessions shows this SQL:
UPDATE WWV_FLOW_DATA SET ITEM_VALUE = NVL(NVL(:B6 ,:B5 ),1)||':'
|| NVL(NVL(:B4 ,:B3 ),15)||':0:0' WHERE ITEM_ID = :B2 AND FLOW_I
NSTANCE = :B1
Fair to assume that all 3 are hitting the same row? (same flow instance and item?)
I've done some searching and it seems that a lot of dead locks have been reported on similar APEX tables. Is this potentially the same underlaying issue, but with just slightly different symptoms?
Some speculation... tabbed browsing is very common with Firefox. I often open multiple tabs on the same APEX app for different pages. What will the back-end impact be if this is done on the same page? Could it be that APEX expects a single-HTTP-request-at-a-time-from-a-web-session?
What does not make sense though is why the update will show row lock contention, assuming all 3 hit the same row. The INSERT should when inserting a row with the same PK as that of an uncommitted inserted row of another session. But why would the UPDATEs in this scenario show row lock enqueues? The INSERT row enqueue points that the row has not yet been committed. If so, the 3rd session's UPDATE should return "no row found" and not be stuck on a row lock enqueue.. right?
This does not make much sense to me.
Any comments, suggestions, and ideas to troubleshoot and resolve this will be much appreciated.> When you and the APEX developer say "slow performance", have you ensured
that this is not logic in the APEX application itself?
The "slow performance" the APEX developer and users mention are usually pages timing out all together. There are no real heavy and complex SQLs executed to my knowledge (none I see on the server side). So I do not think it is an application SQL issue - besides, the "slow performance" on the back-end side, when reported, I seen as sessions spinning on enqueue TX locks.
Not my APEX system so I'm not that familiar with it, but I had a quick look at it. The pages are relatively simplistic as there is no custom stuff (unlike some my APEX apps ;-) ).
Also, this problem does not occur on a specific page, but intermittently on different pages.
> were they all for the same APEX session emanating from the same client?
Unsure.. I kind of expect these will have to be or else the SQL statement will be hitting a different flows row all together (which is why I speculated about the tabbed browser issue). Busy investigating this closer.
>Have statistics been computed recently on the FLOWS_030000 schema?
No. Interesting point as I've (very stupidly) never even considered running DBMS_STATS on the flows schema...
What is interesting btw is that SQL is not static. The latest blocks (same event, same symptoms as described in my original posting) were on this SQL:
UPDATE WWV_FLOW_PREFERENCES$ SET ATTRIBUTE_VALUE = :B5 WHERE USE
R_ID = NVL(:B4 ,NVL(:B3 ,USER)) AND PREFERENCE_NAME = :B2 AND SE
CURITY_GROUP_ID = :B1
It also could be as a result of multiple sessions from the same web browser due to clicking a button/link more than once, or refreshing the browser without waiting at least a few seconds for a response.. (also, the fact that the browser is waiting for a response is not very visual/noticeable to the user)
Am planning to spend some time on this issue tomorrow and will try and provide better technical feedback.
If you have anything specific I can test from my side, please just shout Joel. -
V$system_event, timeouts and row lock contention
Hello everyone,
What is the meaning of the total_timeouts column in the v$system_event view if it is related to the event "enq: TX - row lock contention"?
How can we have a timeout since "query timeout" is a non existent concept on Oracle?
Maybe I am wrong.
Regards.
CarlHello everyone,
What is the meaning of the total_timeouts column in
the v$system_event view if it is related to the event
"enq: TX - row lock contention"?
How can we have a timeout since "query timeout" is a
non existent concept on Oracle?
Maybe I am wrong.
Regards.
CarlThe value for timeouts, in this case, indicates the number of times one of the sessions had to wait a full 3 second time slice while waiting for a second session to either commit or roll back, in anticipation of a potential primary key violation. If the second session commits, the first session will receive an error indicating a primary key violation.
Test setup:
In session 2:
CREATE TABLE T1 (C1 VARCHAR2(20) PRIMARY KEY);
INSERT INTO T1 VALUES ('ORACLE');
In session 1:
INSERT INTO T1 VALUES ('ORACLE');
After executing tha above, allow 60 seconds to elapse after the insert in session 1, and then check the delta values in either V$SYSTEM_EVENT or V$SESSION_EVENT:
20 waits on ENQ: TX - ROW LOCK CONTENTION, 19 timeouts, 59.99 seconds, with an average wait of 2.9995 seconds.
Charles Hooper
IT Manager/Oracle DBA
K&M Machine-Fabricating, Inc. -
TX - row lock contention in SELECT query without update clause
Hi,
We are having problem in one of our application on production. The ASH report shows 'eq: Tx row lock contention' for only Select statements. There is no FOR UPDATE in the select statements. The exact statement is
enq: TX - row lock contention : SELECT COUNT (1) FROM Table1 WHERE col1= :1 AND col2= :1 AND col3= :1 AND ROWNUM = 1
enq: TX - row lock contention : SELECT MODULE_CD , MSG_DESC , SEVERITY FROM GS_ERROR_MSG WHERE MSG_NUM = :1
I don't know why the select are locking the table rows and resulting in waits..
Our environment is Oracle 10g and Forms & Reports..
Please help.
-- PrashantHi,
are you sure that there is no dml against the tables?
You can query v$active_session_history (eg column BLOCKING_SESSION) to see which session locked the row.
HTH..
- wiZ -
Index contention & row lock contention
Hi,
Recently our application loaded a handsome amount of data into our production database. The process took around 5 to 6 hours. During this process, we observed that the performance degraded.
The major wait events are
1) TX index contention (concurrency) and
2) ROW LOCK CONTENTION (application).
The sql which lead to index contention is a simple insert statement into a table x and row lock contention is into a table y.
Both x and y are major detail tables of our application. X has around 4 foreign keys, one foriegn key is referencing table y. the foreign key column x is indexed.
our database is on 10gR2 and using ASSM.
The data block wait event stats during the load process is as follows
select * from dba_hist_waitstat where snap_id between '21454' and '21462' AND WAIT_COUNT>0 and class='data block';
SNAP_ID DBID INSTANCE_NUMBER CLASS WAIT_COUNT TIME
21454 3937665896 1 data block 195089769 33899167
21455 3937665896 1 data block 195095958 33902183
21456 3937665896 1 data block 195096398 33902377
21457 3937665896 1 data block 195097225 33902843
21458 3937665896 1 data block 195628987 34037147
21459 3937665896 1 data block 195944006 34055524
21460 3937665896 1 data block 195944496 34055642
21461 3937665896 1 data block 196183308 34112433
21462 3937665896 1 data block 196213292 34127409
9 rows selected.
select snap_id,eq_type,req_reason, total_req#, total_wait#,failed_req#, cum_wait_time from dba_hist_enqueue_stat where snap_id between '21454' and '21462' and failed_req#>0 and eq_type='TM'
SYS@sqdb AS SYSDBA> /
SNAP_ID EQ REQ_REASON TOTAL_REQ# TOTAL_WAIT# FAILED_REQ# CUM_WAIT_TIME
21454 TM contention 682928465 14 2735 1750
21455 TM contention 682939964 14 2735 1750
21456 TM contention 682950668 14 2735 1750
21457 TM contention 682967980 14 2735 1750
21458 TM contention 682983109 14 2735 1750
21459 TM contention 682998136 14 2735 1750
21460 TM contention 683006816 14 2735 1750
21461 TM contention 683018179 14 2735 1750
21462 TM contention 683432945 14 2735 1750
9 rows selected.
I dont see any significant ITL contention on these objects compared to other contention. (from segment statistics)
SYS@sqdb AS SYSDBA> select b.object_name,a.snap_id, a.physical_writes_total,a.physical_writes_delta,a.physical_reads_total,a.physical_reads_delta, a.itl_waits_total,a.itl_waits_delta from dba_hist_seg_stat a,(select object_id,object_name from dba_objects where owner='ABCD') b where snap_id between '21454' and '21462' and a.obj#= b.object_id and a.itl_waits_delta> 0 order by itl_waits_delta,2,1;
OBJECT_NAME SNAP_ID PHYSICAL_WRITES_TOTAL PHYSICAL_WRITES_DELTA PHYSICAL_READS_TOTAL PHYSICAL_READS_DELTA ITL_WAITS_TOTAL ITL_WAITS_DELTA
IX4_Y 21462 37958 169 105668 174 38 1
IX4_X 21462 102380 1480 147196 5780 56 1
As per the application design, for each row of Y, there are multiple number of rows in X and it varies. What additional information do you think I should be collecting and any tips to fix the issue?
Thanks,
Murthyhi
Are you using in your insert statement something like "SELECT ... FOR UPDATE"
post the result of this query during the error:
SELECT * FROM DBA_BLOCKERS;
SELECT * FROM DBA_WAITERS; -
Row lock contention...
Hello,
I am working on Oracle 10.2.0.4 on AIX .
In awr reports we found 'row lock contention' as top wait events. As my knowledge There are two types of locks..
1. Deadlock - where oracle will automatically rollback the locking query and generate deadlock trace file.
2. A user session update some rows and not commit/rollback , so other sessions which need to lock same rows , were witing. So dba need to manully kill first
session which was holding lock.
We want to know , in which of above scenario in awr report we can see 'row lock contention' wait.
any idea ..Ok, first, I think your definitions are a bit off.
There is the concept of a lock, or an enqueue. The terms 'lock' and 'enqueue' are synonymous, in Oracle.
A lock (or enqueue) protects a 'resource'. A TX (transaction) enqueue protects rows which have been locked. Only one transaction is permitted to modify a specific row in a specific table, at a time, for obvious reasons.
A row-level lock occurs when a session attempts to modify a row that another session has already locked. When that occurs, the session attempting the lock will wait on a TX enqueue.
These types of locks occur all the time in Oracle, and are not necessarily a bad thing. They are a sign that Oracle is protecting the integrity of your data, and that's a good thing.
However, when waits on row-level locks begin to dominate the response time of your application, then you have a problem. Generally, this is going to come down to your application design. How can you avoid concurrent sessions colliding on their updates to specific rows? This is something that only you, with your knowledge of your application, can answer.
Finally, you mentioned the term 'deadlock' before. A deadlock occurs when two or more sessions are simultaneously holding a lock that the other is waiting on, while waiting on a lock the other is holding.
A simple example would be as follows:
Consider table_a, with row1 and row2.
Session 1 takes a lock on row1, no problem.
Session 2 takes a lock on row2, no problem.
Now, session 1 attempts to take a lock on row2, but session 2 has lock, so it waits.
Now, session 2 attempts to take a lock on row1, but session 1 has lock, so it waits.
This is a deadlock. It would wait forever. But, the Oracle kernel has a deadlock detection mechanism. So, within 3 seconds, Oracle will detect a deadlock, and one of the sessions (usually the one that has been waiting the longest) will catch ORA-00060 deadlock detected, and statement level rollback will occur.
Hope that clarifies your questions and/or doubts,
-Mark -
Row lock contention error to resolve
hi,
i m facing sever issue with row lock contention error for the statement and causing concurrency and application usage more making database vulnerable
UPDATE RULE_DATA SET RULE_DATA = :B3 , UPDATED_BY = :B2 , UPDATED_DATE = SYSDATE WHERE RULE_DATA_SEQ_ID = :B1
RETURNING PAT_GEN_DETAIL_SEQ_ID INTO :O0
in this query RULE_DATA_SEQ_ID is primary key and and having index too, how can i over come row lock contention error ,
if i try like this will it work
UPDATE RULE_DATA SET RULE_DATA = :B3 , UPDATED_BY = :B2 , UPDATED_DATE = SYSDATE WHERE RULE_DATA_SEQ_ID = :B1
RETURNING PAT_GEN_DETAIL_SEQ_ID INTO :O0
log errors into temp_log (sysdate||:O0 ) REJECT LIMIT UNLIMITED;
commit;
please help me;select sid, sql_text from v$session s, v$sql q
where sid in (select sid from v$session
where state in ('WAITING')
and wait_class != 'Idle'
and event='enq: TX - row lock contention'
and (q.sql_id = s.sql_id or q.sql_id = s.prev_sql_id));
from the above query if found the sid and sql_text,
actually three procedures been called at once as a batch from java and given auto commit at once for the batch;
and in one of the procedure it is called by multiple times with different seq_id's
what i thought is by logging error can we skip the update statement from locking , this what happening
where v_tariff_detail_seq_id will be 25,26,28,29,30 like records
begin
IF v_tariff_detail_seq_id = 0 THEN
INSERT INTO pat_tariff_details (
tariff_detail_seq_id,
pat_gen_detail_seq_id,
ward_type_id ,
room_type_id ,
days_of_stay ,
requested_amount,
approved_amount,
maximum_allowed_amount,
notes,
added_by,
added_date )
VALUES (
pat_tariff_details_seq.NEXTVAL ,
v_pat_gen_detail_seq_id,
v_ward_type_id ,
v_room_type_id ,
v_days_of_stay ,
v_requested_amount ,
v_approved_amount,
v_maximum_allowed_amount,
v_notes,
v_added_by,
SYSDATE );
ELSE
UPDATE pat_tariff_details SET
room_type_id = v_room_type_id,
days_of_stay = v_days_of_stay,
requested_amount = v_requested_amount,
approved_amount = v_approved_amount,
maximum_allowed_amount = v_maximum_allowed_amount,
notes = v_notes,
updated_by = v_added_by,
updated_date = SYSDATE
WHERE tariff_detail_seq_id = v_tariff_detail_seq_id;
END IF;
end;
version is Oracle Database 10g Release 10.2.0.4.0 - 64bit Production
Edited by: user13134817 on Nov 2, 2012 2:39 AM -
Row lock contention problem on Inventory Management
Hi
My client is product based company and have e-Commerce (online Sale Order) application using Oracle database 10.2.0.5 & Web application deployed on WLS. Client have ~ 90 Warehouse country wide and ~ 200 Products (Items). Each product stock for each warehouse is maintained in Inventory Table (INV_BALANCE) which get updated for each order and their sale's products. We are using NO WAIT function to acquire lock on row to update stock balance. Last few months, client business is growing very fast and during Promotional Events (EXPO), they have sales of ~ 75K orders (~ 250K Items) within 2-3 days which start causing row lock contention problem on INV_BALANCE table. We are seeing lots of "Row Lock Wait" and "enq: TX - row lock contention" event which cause ORA-00060: Deadlock detected and we need to eventually clear blocking sessions or everything just choked.
select statistic_name,value from sys.v_$segment_statistics where object_name = 'INV_BALANCE'
STATISTIC_NAME VALUE
logical reads 12423072
buffer busy waits 3895
db block changes 3516768
physical reads 957
physical writes 12197
row lock waits 49909
space used -52921
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TX-00880017-00002584 321 1675 X 110 1445 X
TX-00b60008-00000741 110 1445 X 337 2158 X
TX-0148000b-0000009e 337 2158 X 378 1525 X
TX-01d50015-0000006f 378 1525 X 363 1842 X
TX-02290012-00000070 363 1842 X 267 1798 X
TX-024a0026-0000006e 267 1798 X 364 2084 X
TX-020a0004-0000006f 364 2084 X 135 2113 X
TX-01dc001f-00000070 135 2113 X 129 1586 X
session 1675: DID 0001-0141-000001CA session 1445: DID 0001-006E-00000202
session 1445: DID 0001-006E-00000202 session 2158: DID 0001-0151-0000026B
session 2158: DID 0001-0151-0000026B session 1525: DID 0001-017A-00000167
session 1525: DID 0001-017A-00000167 session 1842: DID 0001-016B-000002B4
session 1842: DID 0001-016B-000002B4 session 1798: DID 0001-010B-000001F1
Rows waited on:
Session 1445: obj - rowid = 0001AE0E - AAAlK8AAHAAD7rMABY
(dictionary objn - 110094, file - 7, block - 1030860, slot - 88)
Session 2158: obj - rowid = 0001AE0E - AAAlK8AAHAAD7rMACD
(dictionary objn - 110094, file - 7, block - 1030860, slot - 131)
Session 1525: obj - rowid = 0001AE0E - AAAlK8AAHAAD7rOAB2
(dictionary objn - 110094, file - 7, block - 1030862, slot - 118)
Information on the OTHER waiting sessions:
Session 1445:
sid: 1445 ser: 37 audsid: 38316795 user: 69/<none>
program: JDBC Thin Client
application name: JDBC Thin Client, hash value=2546894660
Current SQL Statement:
SELECT ROWID, NVL(QTY_PEND,0)+NVL(:B3 ,0) FROM INV_BALANCE WHERE WHS_ID = :B2 AND STOCK_ID = :B1 FOR UPDATE OF QTY_PEND WAIT 10
Please help me on following
Q1: How can we reduce the "row lock Contention" on INV_BALANCE, all possible ways & best practices?
Q2: How can we change the design to not have "row lock Contention" at all?
Appreciate your help
Thanks
Amit Garg
www.otnblogs.comHi Amit!
I saw you are using FOR UPDATE in your query.
If you want reduce row locks, then you not must use FOR UPDATE.
As you know, FOR UPDATE is locking rows.
Regards
Mahir M. Quluzade -
How to find sql causing "enq: TX - row lock contention"
Hi,
In one of our database we keep finding "enq: TX - row lock contention" for 2-3 days. But, then it stopped. The time it happened it blocked other sessions for some long time and it got resolved automatically. Now from ADDM report we got sql queries which waited for this but, we can not find which query from which module was causing the issue. What I should look for that past information. Please help.
Database is 10gR2 on AIX.
Regards,
Gourabmoreajays wrote:
Try executing below query real time
alter session set nls_date_format='dd-mon-yyyy hh24:mi:ss';
SELECT vp.spid,c.inst_id,b.session_id sid,c.serial#,a.object_name,
a.owner object_owner,
Decode(b.locked_mode, 0, 'None',
1, 'Null (NULL)',
2, 'Row-S (SS)',
3, 'Row-X (SX)',
4, 'Share (S)',
5, 'S/Row-X (SSX)',
6, 'Exclusive (X)',
b.locked_mode) locked_mode,
b.oracle_username,
c.program,
d.event,
c.status,
c.last_call_et,
c.sql_address,
e.sql_text, c.logon_time
FROM all_objects a,
gv$locked_object b,
gv$session c,
gv$session_wait d,
gv$sqlarea e,
gv$process vp
WHERE a.object_id = b.object_id
and b.session_id=c.sid
and c.sid=d.sid and c.paddr=vp.addr
and e.address=c.sql_address and lower(d.event) like '%enq%'
ORDER BY 1;
The OP asked for a way of find a historic blocker, not a current blocker.
This query - apart from being one that no-one should want to run on a production system - doesn't say anything about the past, and doesn't identify a blocker.
It reports the sessions that are being blocked, and EVERY table that is currently locked by each session whether or not the table is involved in the current statement.
You're using the gv$ (RAC) views but haven't put in any suitable join predicates on the instance (inst_id) columns; the OP is on 10g so you don't need to join to v$session_wait to pick up the wait information; and the join to v$sqlarea forces a "full tablescan" of the library cache (child cursor derived view) because you're joining on address rather than sql_id.
Regards
Jonathan Lewis -
High enq: TX - row lock contention on RAC database
Hi Gurus,
I have SAP applications running on 5 Oracle 10g (10.2.0.5) RAC nodes.
I could observe high row lock contention in the database.
db file sequential read 13.555.789.712 7.148.542.630 5.27 65
enq: TX - row lock contention 45.685.386 1.622.457.531 355.14 15
CPU 0 1.123.793.901 10
gc buffer busy 969.769.720 365.874.242 3.77 3
gc cr grant 2-way 7.565.517.708 161.443.528 .21 1
log file sync 244.392.565 155.406.980 6.36 1
gc current block busy 86.643.267 139.935.394 16.15 1
db file parallel read 80.779.109 124.238.490 15.38 1
gc current block 3-way 2.412.777.861 98.748.193 .41 1
read by other session 227.935.152 95.543.751 4.19 1
I am able to observe one or two update/insert statements in this state.
I would need your help in go ahead for analyzing and finding out the problematic SQL statements.
Though there is no performance issue at the moment, I would like to initiate this proactively.
Database parameters are set consistently with the latest patches for 10.2.0.5.
Br,
VenkyIf you are licensed for diagnostic pack, look at the ASH data in v$active_session_history and dba_hist_active_sess_history.
Using the p1/p2/p3 columns and the blocking information, you should be able to see what sessions were waiting on and what sql was being run for the sessions waiting. -
Enq: TX - row lock contention on dual
Dear Team,
In my database i can see lots of enq: TX wait in dual
SID MODULE SQL_ID EVENT SECONDS_IN_WAIT BLOCKING_SESSION STATUS
2944 IAPPRAISOR_V20.fmx 5pjx5pj5xsmn7 enq: TX - row lock contention 38 2920 ACTIVE
3050 IAPPRAISOR_V20.fmx enq: TX - row lock contention 769 2915 ACTIVE
3071 IAPPRAISOR_V20.fmx 5pjx5pj5xsmn7 enq: TX - row lock contention 38 2920 ACTIVE
3097 IAPPRAISOR_V20.fmx enq: TX - row lock contention 767 3050 ACTIVE
3117 IAPPRAISOR_V20.fmx 5pjx5pj5xsmn7 enq: TX - row lock contention 572 3319 ACTIVE
SQL> select * from table(dbms_xplan.display_awr('5pjx5pj5xsmn7'));
PLAN_TABLE_OUTPUT
SQL_ID 5pjx5pj5xsmn7
SELECT SYSDATE FROM SYS.DUAL
Plan hash value: 1546270724
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | | 2 (100)| |
| 1 | FAST DUAL | | 1 | 2 (0)| 00:00:01 |
Is there any idea why select on sys.dual putting execlusive lock? Database version 10.2.0.5.
Thanks and Regards,
Rajib SutradharShow us the result of
set linesize 120
set trimspool on
select * from v$lock where sid = 'sid of holding session'l;
select * from v$lock where sid = 'sid of one waiting session'l;Please read the note below about readable output.
Regards
Jonathan Lewis
http://jonathanlewis.wordpress.com
http://www.jlcomp.demon.co.uk
To post code, statspack/AWR report, execution plans or trace files, start and end the section with the tag {noformat}{noformat} (lowercase, curly brackets, no spaces) so that the text appears in fixed format.
There is a +"Preview"+ tab at the top of the text entry panel. Use this to check what your message will look like before you post the message. If it looks a complete mess you're unlikely to get a response. (Click on the +"Plain text"+ tab if you want to edit the text to tidy it up.) -
Enq: TX - row lock contention wait event
Hi,
I would like to find which DML query has not given COMMIT or ROLLBACK after the execution. Because one of the development database have more table locks and developer reported that their session was hanging. I referred AWR report also and more timed waits occurred in the enq: TX - row lock contention. I need to trace which DML query has not commit or rollback.
Please help me to solve the issue.
Database version: 11.2.0.1.0
Foreground Wait Events
Event
Waits
%Time -outs
Total Wait Time (s)
Avg wait (ms)
Waits /txn
% DB time
enq: TX - row lock contention
320
0
72,047
225147
0.20
99.53
log file sync
547
0
14
26
0.35
0.02
library cache lock
13
0
11
843
0.01
0.02
SQL*Net break/reset to client
1,080
0
2
1
0.69
0.00
SQL*Net message to client
659,006
0
1
0
421.63
0.00
direct path sync
3
0
1
299
0.00
0.00
SQL*Net more data from client
5,541
0
1
0
3.55
0.00
db file scattered read
554
0
0
1
0.35
0.00
SQL*Net more data to client
14,975
0
0
0
9.58
0.00
db file sequential read
2,817
0
0
0
1.80
0.00
ADR block file read
4
0
0
43
0.00
0.00
enq: CR - block range reuse ckpt
2
0
0
71
0.00
0.00
asynch descriptor resize
38,073
100
0
0
24.36
0.00
latch: shared pool
61
0
0
1
0.04
0.00
control file sequential read
6,900
0
0
0
4.41
0.00
Disk file operations I/O
550
0
0
0
0.35
0.00
cursor: pin S
1
0
0
8
0.00
0.00
direct path write temp
34
0
0
0
0.02
0.00
library cache: mutex X
5
0
0
1
0.00
0.00
latch: In memory undo latch
2
0
0
1
0.00
0.00
buffer busy waits
14
0
0
0
0.01
0.00
SQL*Net message from client
658,990
0
294,847
447
421.62
jobq slave wait
669
99
333
497
0.43
PL/SQL lock timer
1
100
1
998
0.00Oracle does not and cannot tell you from historical views (e.g. AWR) which DMLs have not COMMITed or ROLLBACKed. A Transaction ends with a COMMIT or ROLLBACK. The transaction could have a million (or more) DML statements with a million (or more) SELECT statements between the first DML and the COMMIT / ROLLBACK.
Even identifying such DMLs in real time is close to impossible. Because the session holding the lock may have issued a dozen or a million subsequent SQL statements while other sessions are waiting for the lock. You can only identify the session that is the lock holder (the BLOCKING_SESSION in V$SESSION).
If you have tracing enabled for all sessions, then you could review the trace file for the BLOCKING_SESSION to identify the DML(s) the session has executed.
Hemant K Chitale -
Enq : TX row lock contention with no lock holder !!
Hi, all.
The database is 2 node RAC (oracle 11.2.0.3 ) on a unix machine.
Today morning, I found the instances sufferred "enq : TX row lock contention" YESTERDAY.
I issued the following query,
but block_session, blocking_session_serial# and blocking_inst_id column are null.
select a.instance_number,a.sample_time,a.session_id,a.session_serial#,a.sql_id,
a.event,a.wait_class, a.p1, a.p2, a.p3,a.current_obj#,
a.blocking_session,a.blocking_session_serial#,a.blocking_inst_id
from dba_hist_active_sess_history a
where a.instance_number=1
and a.event='enq: TX - row lock contention'
order by a.instance_number,sample_id
Any advice will be greately appreciated.
Thanks in advance.
Best Regards.In addition to run the script , also download and run Snapper script from Tanel Poder which would give even more detail for the session .
http://files.e2sn.com/scripts/snapper.sql
HTH
Aman.... -
Enq: TX - row lock contention problem
Hi ,
Db version 10.2.0.4
os solaris.
i have upgraded my database from 9.2.0.4 to 10.2.0.4 by using exp/imp as my database is small.
I have created new instance of 10g and changed parameter values as 9i(as required). then imported from 9i to 10g instance.
After importing in 10g instance we are face application wide performance problem..the response time of the applicatoin was very slow...
i have taken awr report of various times and have seeen
SELECT puid,ptimestamp FROM PPOM_OBJECT WHERE puid IN (:1) FOR UPDATE
this query is causing the problem..enq: TX - row lock contention
Cache Sizes
~~~~~~~~~~~ Begin End
Buffer Cache: 756M 756M Std Block Size: 8K
Shared Pool Size: 252M 252M Log Buffer: 1,264K
Load Profile
~~~~~~~~~~~~ Per Second Per Transaction
Redo size: 2,501.54 3,029.25
Logical reads: 2,067.79 2,504.00
Block changes: 17.99 21.78
Physical reads: 0.02 0.03
Physical writes: 0.41 0.50
User calls: 140.74 170.44
Parses: 139.55 168.99
Hard parses: 0.01 0.01
Sorts: 10.65 12.89
Logons: 0.32 0.38
Executes: 139.76 169.24
Transactions: 0.83
% Blocks changed per Read: 0.87 Recursive Call %: 17.60
Rollback per transaction %: 0.00 Rows per Sort: 16.86
Instance Efficiency Percentages (Target 100%)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Buffer Nowait %: 100.00 Redo NoWait %: 100.00
Buffer Hit %: 100.00 In-memory Sort %: 100.00
Library Hit %: 100.03 Soft Parse %: 100.00
Execute to Parse %: 0.15 Latch Hit %: 99.89
Parse CPU to Parse Elapsd %: 93.19 % Non-Parse CPU: 94.94
Shared Pool Statistics Begin End
Memory Usage %: 86.73 86.55
% SQL with executions>1: 90.99 95.33
% Memory for SQL w/exec>1: 79.15 90.58
Top 5 Timed Events Avg %Total
~~~~~~~~~~~~~~~~~~ wait Call
Event Waits Time (s) (ms) Time Wait Class
CPU time 397 86.3
enq: TX - row lock contention 508 59 115 12.7 Applicatio
log file sync 2,991 5 2 1.1 Commit
log file parallel write 3,238 5 2 1.1 System I/O
SQL*Net more data to client 59,871 4 0 1.0 Network
^LTime Model Statistics DB/Inst: WGMUGPR2/wgmugpr2 Snaps: 706-707
-> Total time in database user-calls (DB Time): 460.5s
-> Statistics including the word "background" measure background process
time, and so do not contribute to the DB time statistic
-> Ordered by % or DB time desc, Statistic name
Avg
%Time Total Wait wait Waits
Event Waits -outs Time (s) (ms) /txn
enq: TX - row lock contentio 508 .0 59 115 0.2
log file sync 2,991 .0 5 2 1.0
log file parallel write 3,238 .0 5 2 1.1
SQL*Net more data to client 59,871 .0 4 0 20.1
control file parallel write 1,201 .0 1 1 0.4
SQL*Net more data from clien 3,393 .0 1 0 1.1
SQL*Net message to client 509,864 .0 1 0 170.9
os thread startup 3 .0 1 196 0.0
db file parallel write 845 .0 1 1 0.3
-> % Total DB Time is the Elapsed Time of the SQL statement divided
into the Total Database Time multiplied by 100
Elapsed CPU Elap per % Total
Time (s) Time (s) Executions Exec (s) DB Time SQL Id
59 1 1,377 0.0 12.9 bwnt27fp0z3gm
Module: syncdizio_op@snstr09 (TNS V1-V3)
SELECT puid,ptimestamp FROM PPOM_OBJECT WHERE puid IN (:1) FOR UPDATE
41 41 459 0.1 8.9 8cdswsp7cva2h
Module: syncdizio_op@snstr09 (TNS V1-V3)
select rpad(argument_name, 32, ' ') || in_out || ' ' || nvl(type_subname, data_t
ype) info from user_arguments where package_name IS NULL and object_name = uppe
r(:1) and argument_name is not null order by object_name, position
39 38 7,457 0.0 8.4 271hn6sgra2d8
Module: syncdizio_op@snstr09 (TNS V1-V3)
SELECT DISTINCT t_0.puid FROM PIMANTYPE t_0 WHERE (UPPER(t_0.ptype_name) = UPPER
(:1))
23 22 459 0.0 4.9 g92t08k78tgrw
Module: syncdizio_op@snstr09 (TNS V1-V3)
SELECT PIMANTYPE.puid, ptimestamp, ppid, rowning_siteu, rowning_sitec, pis_froze
n, ptype_class, ptype_name FROM PPOM_OBJECT, PIMANTYPE WHERE PPOM_OBJECT.puid =
(PIMANTYPE.puid)
22 22 158,004 0.0 4.9 chqpmv9c05ghq
Module: syncdizio_op@snstr09 (TNS V1-V3)
SELECT puid,ptimestamp FROM PPOM_OBJECT WHERE puid = :1
17 17 2,294 0.0 3.7 3n5trh11n1x8w
Module: syncdizio_op@snstr09 (TNS V1-V3)
SELECT PTYPECANNEDMETHOD.puid, ptimestamp, ppid, rowning_siteu, rowning_sitec, p
is_frozen, pobject_desc, psecure_bits,VLA_344_5, pmethod_name, pmsg_name, ptype_
name, pexec_seq, paction_type FROM PPOM_OBJECT,PBUSINESSRULE, PTYPECANNEDMETHOD
WHERE PTYPECANNEDMETHOD.puid IN (:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,in 9i there is a parameter ENQUEUE_RESOURCES but in 10g relese 2 its got obsoleted....
am new to performace tunning please advice me....!
Regards
VamshiThe CBO has changed substantially between 9.2.x and 10.2.x. Pl see MOS Doc 754931.1 (Cost Based Optimizer - Common Misconceptions and Issues - 10g and Above). Pl verify that statistics have been gathered and are current - pl see MOS Doc 605439.1 (Master Note: Recommendations for Gathering Optimizer Statistics on 10g).
Looking at your output, it seems to me that the database is entirely CPU-bound. 86.3% of time is spent on CPU. The last 5 SQL statements in the output, all of the elapsed time is spent on CPU.
Pl post your init.ora parameters, along with your hardware specs. This question might be more appropriate in the "Database - General" forum.
HTH
Srini
Maybe you are looking for
-
HP Connected Music app no longer working
Hello, My HP Connected Music app is no longer working on my Pavilion 15. Every time I open it, it loads then immediately minimizes itself. When I maximize it, it appears to load for a few seconds then minimizes itself again. I hadn't downloaded an
-
Error in apche, tomcat using ajp13
i configured an apche and two tomcat in 3 different machines. i got this message in the jk_log from the apache logs. [Wed Mar 30 02:43:49 2005] [jk_uri_worker_map.c (445)]: Into jk_uri_worker_map_t::map_uri_to_worker [Wed Mar 30 02:43:49 2005] [jk_ur
-
Losing formatting when importing rtf file
Hello and please help! Having just laid out 2 volumes of a 3 volume set via cutting & pasting and manually re-introducing formatting, I have been told in no uncertain terms (not by an expert, I add) that I can preserve everything by using rtf. I've t
-
Window: Arrange: Tile - Breaks open sequence of files
In CS3 this worked perfectly. CS4 it was broken with no workaround. In CS5 it's partially fixed but still not working. I work on animated sequences and use the Window, Arrange, Tile to display all the files at once. To open files in PS and keep the f
-
hello i am making a script but i can't find any tutorials online for what i am looking for so i think you guys can help plzzz ok sop what i am making is a forgot password page for my website i want the user to type their email and a link would be sen