MFC based apllication and row LOCK.
Dear Oracle Tech.
As end user of Oracle Database, we seek advise from Oracle on the following issue: our business application is an Windows system (MFC based) built with Visual Studio 6; Our database is Oracle 9i;
We have a database resources shared by many users that connect in ODBC way. We would like to have that when ever some one is using
(modifing, eg. CRecordset::Edit() - CRecordset::Update() cycle for mfc developers)
a row it is locked by the front end application so that no other can commit changes to that row until this user releases the locks by either quitting the application or by moving on to a different record.
There is a way in oracle functionality to obtain this? In this case other users may read locked record anyway?
Thank You.
I've never heard of the Oracle Control Panel, and nothing like that appears on my machine. Is it possible that this is an Oracle forms-type feature? I have a hard time believing that Oracle would or could provide pessimistic locking for arbitrary applications accessing the database.
The easiest way to implement pessimistic locking is to use the "for update" clause. If I do a "select * from emp for update", every row in the emp table will be locked for writing (Oracle will never block a reader). This assumes that you're not in autocommit mode, since locks will always be released when your transaction ends.
Justin
Similar Messages
-
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. -
Can read-only users obtain row locks on non-temporary (i.e,. visible to other users) tables, for example through SELECT FOR UPDATE, even though they couldn't not ultimately modify said tables?
Yes.
Here is an example with Oracle XE 11G and HR schema:
Connecting as user having only CREATE SESSION and SELECT privilege on HR.JOBS table:
SQL> desc hr.jobs;
Name Null? Type
JOB_ID NOT NULL VARCHAR2(10)
JOB_TITLE NOT NULL VARCHAR2(35)
MIN_SALARY NUMBER(6)
MAX_SALARY NUMBER(6)
SQL> select * from session_roles;
no rows selected
SQL> select * from session_privs;
PRIVILEGE
CREATE SESSION
SQL> select owner, table_name, privilege from user_tab_privs;
OWNER TABLE_NAME
PRIVILEGE
HR JOBS
SELECT
SQL> select job_title from hr.jobs for update;
JOB_TITLE
President
Administration Vice President
Administration Assistant
Finance Manager
Accountant
Accounting Manager
Public Accountant
Sales Manager
Sales Representative
Purchasing Manager
Purchasing Clerk
JOB_TITLE
Stock Manager
Stock Clerk
Shipping Clerk
Programmer
Marketing Manager
Marketing Representative
Human Resources Representative
Public Relations Representative
19 rows selected.
SQL>Now connecting as HR following statement hangs:
SQL> connect hr/hr
Connected.
SQL> select * from jobs for update;Going back to first session:
SQL> update hr.jobs set min_salary=0;
update hr.jobs set min_salary=0
ERROR at line 1:
ORA-01031: insufficient privileges -
Positioned Updates and Row Locking
The latest 8.1.6 driver doesn't seem to support Positioned updates (select for update)... are you planning to do so? If not, is there a nice way to lock records programmatically using jdbc?
Thanks,
Patrick Caldwell
[email protected]Never mind... i just found the answer in your documentation... i was trying to use "setCursorName" but this isn't supported... have to use ROWID to do this...
thanks,
pat -
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; -
I have a Windows server app that generates Excel workbooks to be emailed to political campaign volunteers to be loaded into Numbers on an iPad, edited, then emailed back to be posted to the server database. There are two problems encountered:
1. The Excel workbook has the first row (column headings) and first column (route identifier) of cells locked, so that they will not scroll off the screen, but Numbers doesn't respect the locks, so when the user scrolls horizontally or vertically, the column headings and/or the route identifier scroll off the screen.
2. The Excel workbook has pop-up "tool-tip" type comments in certain column headings in order to provide the user with the acceptable entries for those columns, but Numbers does not respect those. When the user touches any of the commented column heading cells, a context menu appears instead of the comment.
What must I do in the Excel workbook sheets, or what settings can be made in Numbers to correct the above?I imported a Numbers '09 file into Numbers on the iPad. All comments were removed during import. Frozen header row and column were retained.
Thank you for your responses I must ask, however, when you refer to "importing" the Excel file, are you referring to a two step process whereby the Excel file is first converted by some other process into Numbers format, then opened in the Numbers application - which is what I have to do in my PC application to generate the Excel file, and reverse that process to convert the Excel back into my database format - or are you simply referring to opening the file in Numbers as "importing" it? And please excuse any ignorance, as I'm not at all familiar with Apple's terminologies. In fact, I don't own an iPad myself, but rather I have to depend on one of my clients to do the testing for me.
I imported an XLSX file into Numbers on the iPad. The file used "freeze panes" to "freeze" the first column and row. Only warning on import was that it changed fonts. It imported without the first row and column frozen and with no comments. Nothing I can do about the missing comments but it was a simple matter to turn the first column & row into headers and freeze them.
Unfortunately this would not be an efficient solution, since the end users are, for the most part, elderly political campaign volunteers who are fairly computer illiterate. These workbooks are actually canvassing lists - known as walklists. Their purpose is for the volunteers to interview voters, record the results of the interviews, and post the results to a database, which provides the campaigns with valuable strategizing capabilities. Also, these workbooks have multiple pages - as many as 10 or more. and from what I infer from the above, the setting changes would have to be made on each page.
My whole intent in developing this iPad/Tablet methodology was to significantly reduce volunteer's work - which is a recruitment benefit - and eliminate paper. While the latter would be accomplished, the former would not, and in fact would tend to increase it. It's necessary to keep the first row - column headings - and the first column - the route identifier - from scrolling off the page, so that the volunteer won't have to keep scrolling up and down and right and left to know what the data are.
Conclusion: Comments are not supported on the iPad version of Numbers. Frozen headers are not imported from Excel but can be recreated easily.
I was previously directed to the Apple website http://www.apple.com/ipad/from-the-app-store/apps-by-apple/numbers.html which extols the wonders of the Numbers application. About halfway down the page there's a section regarding, "Sliders steppers and pop-ups". The web page states that pop-ups can be set up but, being a marketing site, gives no indication whatsoever as to how it's done. I was hoping someone could tell my if there's any way to carry them over from an Excel file. -
Hi All,
I have two table with similar structure and data, one is on disk and the other is in memory. I somehow calculated the difference between a row size of on disk and in memory table and found that the row size of in memory is 700 Bytes more than the disk based
tables.
aaAs others mentioned, memory optimized tables and disk based tables have different structures in SQL Server 2014.
For memory optimized tables, the number of indexes on table also contribute to the size. You can calculate the exact size of rows and thus the table size using the formula given in the below articles
Table and Row Size in Memory-Optimized Tables
Estimate the Size of a Table
Krishnakumar S -
How and when the database release a row lock?
Dear experts,
We are using the following statement to obtain a row lock in a table in the database(ORACLE of course),
SELECT * FROM {TABLE_NAME} WHERE ID = 1 for update
and if we succeed grabbing the row lock we will continue to issue a update statement every 30 seconds to preserve the lock as far as possible.
here is the update statement to preserve the lock,
UPDATE {TABLE_NAME} SET time = ? WHERE ID = 1.
As you see more longer we keep holding the row lock , more update statements are submitted in the pending transaction.
In normal case our application can grab the exclusive row lock and works for a long time,however sometimes a connection reset exception is thrown
and our application will close the connection(I assume the pending transaction will be rolled back by the database) and exit the JVM.
Since other applications will keep trying to grab the same row lock to become the master role,
we expect one of them can succeed but they are all failed because the database has not released the row lock as expected.
Can someone explain more details about how and when the row lock can get released in our use case?
Thanks,
SuoNayi
Edited by: SuoNayi on 2013-5-30 上午8:12Hm. Is this part of an XA transaction by any chance? I know that Oracle maintains separate bookkeeping for such transactions which can cause rows to stay 'locked' even when the regular DBA views will indicate there is no user currently locking the record at all. I have no idea about the actual details and what you need to do to clean up such a situation, that is something a DBA should know and do.
If not... well this is more of a question for people who know the DBMS, which makes it a target for the Oracle DBMS forums. Java developers don't tend to have DBA-level knowledge of the database, you should ask the question where you have more chance of people with expertise answering stuff:
General Database Discussions -
Identifying deadlocked resources in graph with 1 row lock and 1 table lock
Hi, I have run into repeated occurrences of the deadlock graph at the bottom of this post and have a few questions about it:
1. It appears that proc 44, session 548 is holding a row lock (X). Is the waiter, proc 30, session 542, trying to acquire a row lock (X) also or an exclusive table lock (X) on the table containing that row?
2. Under what circumstances would something hold a row exclusive table lock (SX) and want to upgrade that to a share row exclusive table lock (SSX)?
3. Our table cxml_foldercontent has a column 'structuredDataId' with a FK to cxml_structureddata.id and an ON DELETE SET NULL trigger. Would this help explain why an "update" to one table (i.e.g cxml_foldercontent) would also need to acquire a lock in a foreign table, cxml_structureddata?
4. What is the difference between "Current SQL statement:" and "Current SQL statement for this session:"? That terminology is confusing. Is session 542 executing the "update" or the "delete"?
5. In the "Rows waited on:" section is it saying that Session 542 is waiting on on obj - rowid = 0000BE63 - AAAL5jAAGAAA6tZAAK or that it is has the lock on that row and other things are waiting on it?
A couple of notes:
- the cxml_foldercontent.structuredDataId FK column has an index on it already
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TX-003a0011-000003d0 44 548 X 30 542 X
TM-0000be63-00000000 30 542 SX 44 548 SX SSX
session 548: DID 0001-002C-000002D9 session 542: DID 0001-001E-00000050
session 542: DID 0001-001E-00000050 session 548: DID 0001-002C-000002D9
Rows waited on:
Session 542: obj - rowid = 0000BE63 - AAAL5jAAGAAA6tZAAK
(dictionary objn - 48739, file - 6, block - 240473, slot - 10)
Session 548: no row
Information on the OTHER waiting sessions:
Session 542:
pid=30 serial=63708 audsid=143708731 user: 41/CASCADE
O/S info: user: cascade, term: unknown, ospid: 1234, machine:
program: JDBC Thin Client
application name: JDBC Thin Client, hash value=2546894660
Current SQL Statement:
update cascade.cxml_foldercontent set name=:1 , lockId=:2 , isCurrentVersion=:3 , versionDate=:4 , metadataId=:5 , permissionsId=:6 , workflowId=:7 , isWorkingCopy=:8 , parentFolderId=:9 , relativeOrder=:10 , cachePath=:11 , isRecycled=:12 , recycleRecordId=:13 , workflowComment=:14 , draftUserId=:15 , siteId=:16 , prevVersionId=:17 , nextVersionId=:18 , originalCopyId=:19 , workingCopyId=:20 , displayName=:21 , title=:22 , summary=:23 , teaser=:24 , keywords=:25 , description=:26 , author=:27 , startDate=:28 , endDate=:29 , reviewDate=:30 , metadataSetId=:31 , expirationNoticeSent=:32 , firstExpirationWarningSent=:33 , secondExpirationWarningSent=:34 , expirationFolderId=:35 , maintainAbsoluteLinks=:36 , xmlId=:37 , structuredDataDefinitionId=:38 , pageConfigurationSetId=:39 , pageDefaultConfigurationId=:40 , structuredDataId=:41 , pageStructuredDataVersion=:42 , shouldBeIndexed=:43 , shouldBePublished=:44 , lastDatePublished=:45 , lastPublishedBy=:46 , draftOriginalId=:47 , contentTypeId=:48 where id=:49
End of information on OTHER waiting sessions.
Current SQL statement for this session:
delete from cascade.cxml_structureddata where id=:1Mohamed Houri wrote:
What is important for a foreign key is to be indexed (of course if the parent table is deleted/merged/updated, or if a performance reason imposes it). Wether this index is unique or not doesn't matter (as far as i know).But, you should ask your self the following question : what is the meaning of having a 1 to 1 relationship between a parent and a child table ? if you succeed to create a unique index on your FK then this means that for each PK value corresponds at most one FK value!! Isn't it? is this what you want to have?Thanks, as I mentioned above, cxml_structureddata is actually the child table of cxml_foldercontent with 1 or more records' owningEntityId referring to rows in cxml_foldercontent. The reason for the FK on cxml_foldercontent.structuredDataId is a little ambiguous but it explained above.
Will a TX-enqueue held on mode X always be waited on by another TX-enqueue row lock X? Or can it be waited on by an Exclusive (X) table lock?Not really clear. Sorry, are you saying my question is unclear or it's not clear why type of eXclusive lock session 542 is trying to acquire in the first line of the trace? Do you think that the exclusive lock being held by session 548 in the first line is on rows in cxml_foldercontent (due to the ON DELETE SET NULL on these child rows) or rows in the cxml_structureddata that it's actually deleting?
Is there any way for me to tell for certain?
The first enqueue is a TX (Transaction Enqueue) held by session 548 on mode X (exclusive). This session represents the blocking session. At the same time the locked row is waited on by the blocked session (542) and the wait is on mode X (exclusive). So put it simply, we have here session 542 waiting for session 548 to release it lock (may be by commiting/roll backing). At this step we are not in presence of a deadlock.
The second line of the deadlock graph shows that session 542 is the blocking session and it is doing a TM enqueue (DML lock) held on SX(Shared eXclusive). While session 548(which is the waiting session) is blocked by session 542 and is waiting on SSX mode.
Here we see that 548 is blocking session 542 via a TX enqueue and session 542 is blocking session 548 via a TM enqueue ---> That is the deadlock. Oracle will then immediately choose arbitrarlly a victim session (542 or 548) and kill its process letting the remaining session continuing its work.
That is your situation explained here.Thanks, any idea why session 542 (the DELETE from cxml_structureddata) would be trying to upgrade it's lock to SSX? Is this lock mode required to update a child tables foreign key columns when using an ON DELETE SET NULL trigger? Having read more about SSX, I'm not sure I understand in what cases it's used. Is there a way for me to confirm with 100% certainty specifically which tables in the TM enqueue locks are being held on? Is session 548 definitely trying to acquire an SSX mode on my cxml_foldecontent table or could it be cxml_structureddata table?
(a) Verify that all your FK are indexed (be carreful that the FK columns should be at the leading edge of the index)Thanks, we've done this already. When you say the "leading edge" you mean for a composite index? These indexes are all single column.
(b) Verify the logic of the DML against cxml_foldercontentCan you be more specific? Any idea what I'm looking for? -
Hi I am trying to create a form/spreadsheet for shift bosses at work. I want them to be able to imput certain data but I also want to lockout certain columns and rows. Mostly so the formulas aren't tampered with. Is this possible?
Also, is it possible to save to a database?
Any help would be much appreciated.dogg,
Create separate Input and Calculation tables. Lock the calculation table (Arrange > Lock), leave the input table accessible. If you don't want the calculations to be viewed during input, you can change the colors of all lines, fills and text to White before locking, and put them on a different Sheet for good measure.
Another technique that plays on Numbers graphics advantage is to cover areas of your sheet that you wish to protect with a shape. Create a Shape and place it to cover your sensitive equations. Then set the Shape's Fill Color to 0% Opacity and lock the shape. Now you have what I call the salad bar sneeze guard effect for spreadsheets. You can defeat it if you try hard, but it works most of the time.
Jerry
Message was edited by: Jerrold Green1 -
How to lock a row and release lock
Hello
There are two thread, they read the same row, I want to lock this row when the first thread read the record, after this thread commit its data, release the lock, the second thread can lock this record, also can commit its data. I also want to know how to release the lock. And these operations are in different Classes, e.g. in Class A first thread lock the record, in Class B second lock the record, and in Class C release the lock.
Note: these two thread will read this record at same time.
Thanks in advance.TopLink provides to forms of locking, optimistic and pessimistic.
<p>
You are referring to pessimistic. You can use pessimistic locking in TopLink through the ReadObject/ReadAllQuery API acquireLocks(), or acquireLocksWithoutWaiting(), this will use a "Select ... for Update" in SQL. You must be in a transaction to lock a row in the database (UnitOfWork in TopLink), and you locks are released when you commit or rollback the transaction. If you are using JPA, TopLink supports a JPA query hint "toplink.pessimistic-lock"="Lock" to allow pessimistic locking.
<p>
You can also use optimistic locking. An optimistic lock does not prevent another user from reading the same row, but ensures that only one user will be able to commit changes to the row. Optimistic locking typically has the advantage of better concurrency, and does not have issues with deadlocks.
<p>---
<br>James Sutherland
<br>Oracle TopLink, EclipseLink
<br>Wiki: Java Persistence, EclipseLink -
Lock first column and row of a grid so they don't scroll of the screen
Hello,
In a flex app we use a grid with repeaters to build it dynamically depending on a datafeed. But we need the first row and column to stay always on the screen. Any ideas on how to do this ? Did a search for an example but couldn't find anything like it.
I know it exists for a datagrid, but can't find any similar for a grid...
http://flexonblog.wordpress.com/2008/04/22/lock-columns-and-rows-in-datagrid-for-visibilit y/
Thanks for any ideas!
FrankDoesn't exist for Grid container. You might just remove the first items from the dataProvider and place them outside the Grid.
Alex Harui
Flex SDK Developer
Adobe Systems Inc.
Blog: http://blogs.adobe.com/aharui -
I have a set of stored procedures in SQL
One of which is called to build a list of entries to submit to a web service
Those queries are called by identical processes running on different machines, so to prevent duplicate processing we lock rows that are presently being processed.
BEGIN
TRAN TRAN1
SELECT t.[TransactionId],t.[ContentIdentifier]
FROM [dbo].[Transactions]
t WITH(READPAST,
UPDLOCK,
ROWLOCK)where
(t.Quarantined
<> 1)
COMMIT
A Second stored procedure simply updates the Quarantined flag.
My C# code
TransactionOptions transactionOptions
=
new
TransactionOptions();
transactionOptions.IsolationLevel
=
IsolationLevel.ReadCommitted;
transactionOptions.Timeout
=
new
TimeSpan(0,
10,
0);
using (TransactionScope
scopeMain =
new
TransactionScope(TransactionScopeOption.Required,
transactionOptions))
TransactionsReady = DAL.GetFilesForProcessingByServiceType(i);
using (TransactionScope
scopeSuppress =
new
TransactionScope(TransactionScopeOption.Suppress,
transactionOptions))
foreach (var
Transaction in TransactionsReady)
{ try
returnData = proxy.Submit(stuffToProcess);
using (var
scopeInner =
new System.Transactions.TransactionScope())
DAL.QuarantineTransaction(Transaction.TransactionId);
scopeInner.Complete();
scopeSuppress.Complete();
scopeMain.Complete();
The problem I experience is that if I have the Transaction Scope scopeSuppress uncommented, then the QuarantineTransaction stored procedure deadlocks.
However if I comment out the ScopeSuppress, while the process then works, if it is interrupted mid-way, then all of the Quarantine flags get reset, meaning the entire batch of items will get re-submitted next
pass (this is not desirable).
What I actually want to occur, is for the Quarantine flag to be retained on all processed records so that even if the program terminates unexpectedly, processed items remain processed but all the row locks are
released.
Does anyone know of a way to achieve this ?The hour is late where I sit, so I don't have the time to dive into this in detail.
However, if memory serves, TransactionScopes defaults to Serializable isolation level, which may explain the deadlocks you are getting.
Erland Sommarskog, SQL Server MVP, [email protected] -
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 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
Maybe you are looking for
-
OBIEE not applying outer join syntax to filters
(Note: I've already thoroughly searched the forums before posting this. Thanks) My problem is the following: I'm trying to build a report that is a count from my fact table, grouped by month from my date dimension for a given year, resulting in 12 da
-
Ease in/out for a scaling image?
I have an image with a keyframe on the first frame and one on the last, and I have the image scaling up on the last frame. I'm not happy with how CS6 is scaling the image up, I would like to have it do it smoother. I right click on the last keyframe
-
I need to provide red color to the texbox control in list tile
Hi, I need to provide red color to the texbox control in list tile, please reply if any one knows how to do it. Thanks, Vijay.
-
Customeraging wise b/a report
Hi in have to see customer aging wise b/s items which repiort i have to run
-
CUTOVER STRATEGY (CUTOVER DATA)
HI When working in the project there is an stage where u have to deside CUTOVER STARTEGY (CUTOVER DATA) before go live phase can any one expalin what CUTOVER STARTEGY means in project point of view. Maximum (Releted Project).. Manoj.