Update query hangs due to a record lock
Hi All,
I am writing a Java application that uses JDBC to connect to an
Oracle DB server.
I'm trying to update a record locked from another transaction.
Since I don't want to wait the termination of the other transaction, how can I recognize that the record is locked?
Notice that I don't want to ask if the record is locked before my update is starting.
Can I set the JDBC driver in order to raise an exception instead to leave the second transaction in a long waiting?
Thanks
You can try setting a timeout for the update. I have used this in Oracle with a PreparedStatement. It's simple to try out...
ps.setQueryTimeout(45); // set timeout to 45 seconds
Similar Messages
-
Update query for large no of records
i have a doubt regarding an update statement and performance.
There is a table with the following fields:
empno,ename,esal,edept..etc.,
now consider that i want to update the field salary with null for all the employees and suppose there 10 million records...how will i do that efficiently....?Assuming updating the rows is the most efficient solution, write a single UPDATE statement that updates 10 million rows. 10 million rows isn't huge by today's standards. My laptop can update 10 million rows of a moderately sized table in a couple minutes at the outside.
Justin -
After updating to Firefox 5 my Realplayer Recorder is not working due to that add on not being compatible. How do I get this to work again?
Blue
It sounds like you restored from an old back-up. Did you back-up just before your software update? It will use your last one and if your last back-up was a ywear old then it will use that one.
In general, if you are getting these messages on your iPhones select logout (when you get that Apple Id request) and then log back in with your newer ID.
Sorry for your losses.
Cheers -
Update Query is Performing Full table Scan of 1 Millions Records
Hello Everyboby I have one update query ,
UPDATE tablea SET
task_status = 12
WHERE tablea.link_id >0
AND tablea.task_status <> 0
AND tablea.event_class='eventexception'
AND Exists(SELECT 1 from tablea ltask where ltask.task_id=tablea.link_id
AND ltask.task_status = 0)
When I do explain plan it shows following result...
Execution Plan
0 UPDATE STATEMENT Optimizer=CHOOSE
1 0 UPDATE OF 'tablea'
2 1 FILTER
3 2 TABLE ACCESS (FULL) OF 'tablea'
4 2 TABLE ACCESS (BY INDEX ROWID) OF 'tablea'
5 4 INDEX (UNIQUE SCAN) OF 'PK_tablea' (UNIQUE)
NOW tablea may have more than 10 MILLION Records....This would take hell of time even if it has to
update 2 records....please suggest me some optimal solutions.....
Regards
MaheshI see your point but my question or logic say i have index on all columns used in where clauses so i find no reason for oracle to do full table scan,,,,
UPDATE tablea SET
task_status = 12
WHERE tablea.link_id >0
AND tablea.task_status <> 0
AND tablea.event_class='eventexception'
AND Exists(SELECT 1 from tablea ltask where ltask.task_id=tablea.link_id
AND ltask.task_status = 0)
I am clearly statis where task_status <> 0 and event_class= something and tablea.link_id >0
so ideal case FOR optimizer should be
Step 1)Select all the rowid having this condition...
Step 2)
For each row in rowid get all the row where task_status=0
and where taskid=linkid of rowid selected above...
Step 3)While looping for each rowid if it find any condition try for rowid obtained from ltask in task 2 update that record....
I want to have this kind of plan,,,,,does anyone know how to make oracle obtained this kind of plan......
It is try FULL TABLE SCAN is harmfull alteast not better than index scan..... -
Update query issue to update middle (n records) of the rows in a table
Hi
I have a below requirement for that I gone thru one below appoch to fulfill my requirement.
Requirement:
I need to pull 3 crore data thru ODI, source table does not have a primary key and it have 200 columns with 3 crores records (it has a 25 columns as composite key).
I need to populate those 3 crores records into target oracle DB but when I tried to load 3 crores at time I got an error so I approch incremental load, since for that I need to update for each 1 crore records with flg1,flg2 anf flg3 (flag values), for this update I have added one more column in source table using those flag values I can populate 1 crore records in target machine.
Approch
For aove requirement I writem below query to update flg1 for first crores records update tbl_name set rownum_id='flg1' where rownum<=10000000; and it updated successfully without any error, for second, to update flg2 for 2nd crore records I wrote below update query and it execute 20min and given *0 rows updated* Please help if below query is wrong
Query: update tbl_name set rownum_id='flg2' where rownum<=20000000 and rownum_id is NULL;
Thanks in advance
Regards,
PhanikanthA couple of thoughts.
1. This forum is in English and accessed by people in more than 100 countries. Use metric counts not crore. Translate to million, billions, trillions, etc.
2. No database version ... makes helping you very hard.
3. 200 columns with 25 in a composite key is a nightmare by almost any definition ... fix your design before going any further.
4. What error message? Post the complete message not just your impression of it.
5. Oracle tables are heap tables .. there is no such concept as the top, the bottom, or the middle.
6. If you are trying to perform sampling ... use the SAMPLE clause (http://www.morganslibrary.org/reference/select.html#sssc).
7. What is ODI? Do not expect your international audience to know what the acronym means. -
Update query for 2 lakhs records
I have 2 tables with 3 common columns (Col1, col2,Primary). One common column name is primary (oracle key word). No indexes are used on these tables. I need to write an update query as shown below.
Emp table
Col1 col2 primay
100 101 y
103 104 n
201 105 y
100 101 y
Dept table
Col1 col2 primay
100 101 null
103 104 null
000 656 null
Update query Result
Col1 col2 primary
100 101 y
103 104 n
Please help me.
ThanksUpdate dept d
set d.primay = (select distinct e.primay from emp e where e.col1 = d.col1 and e.col2 = d.col2);
In emp table there are 100 and 101 with two entries but with same primay value. so to handle such scenarios I have taken distinct iniside select statement.
if you have a case like where in emp table col1 and col2 are same and having different primay table, then obviously you should tell which value should go and update the dept table and based on what logic. -
Who has the @#$% record locked!?
I know there are hundreds of other posts asking this (I've read every one I think), but none give the whole answer (unless I haven't found that one yet). I hate to have to add another one, but I can't believe this has not been resolved due to the sheer number of people asking for this.
Instead of the non-user friendly "Could not reserve record..." message which means nothing to the users and just generates calls to me, I want to display "User XYZ has the record locked" so the user that gets this message will call the other user instead! Should be simple, right?
I know to use the on-lock trigger and select for update to see if the row is locked. I know to use v$lock to look for rows with the type of 'TX'. The trouble is, there will be multiple TX type rows. How do I know which one is MY row? No column in v$lock, v$locked_object or v$session seems to map to the rowid, which is the only way I know to identify MY row.
Please, how do I relate MY row to one of the TX type rows in v$lock (or a row in v$locked_object which has the userid in it)!? Are there other system views I need to be aware of that have this info maybe?
Thanks for any info. I'm using forms 10g (9.0.4) against the 10g database.
GaryWell, I have reread your post, and maybe you can use a variant of inolau query :
SQL> select
2 (select osuser from v$session where sid=a.sid) blocker,
3 a.sid,
4 (select serial# from v$session where sid=a.sid) serial#,
5 ' blocks ',
6 (select osuser from v$session where sid=b.sid) blockee,
7 b.sid, c.username username
8 from v$lock a, v$lock b, v$session c
9 where a.block = 1
10 and b.request > 0
11 and a.id1 = b.id1
12 and a.id2 = b.id2
13* and b.sid = c.sid
SQL> You know your session id, so you know who is blocking you. -
Sql query slowness due to rank and columns with null values:
Sql query slowness due to rank and columns with null values:
I have the following table in database with around 10 millions records:
Declaration:
create table PropertyOwners (
[Key] int not null primary key,
PropertyKey int not null,
BoughtDate DateTime,
OwnerKey int null,
GroupKey int null
go
[Key] is primary key and combination of PropertyKey, BoughtDate, OwnerKey and GroupKey is unique.
With the following index:
CREATE NONCLUSTERED INDEX [IX_PropertyOwners] ON [dbo].[PropertyOwners]
[PropertyKey] ASC,
[BoughtDate] DESC,
[OwnerKey] DESC,
[GroupKey] DESC
go
Description of the case:
For single BoughtDate one property can belong to multiple owners or single group, for single record there can either be OwnerKey or GroupKey but not both so one of them will be null for each record. I am trying to retrieve the data from the table using
following query for the OwnerKey. If there are same property rows for owners and group at the same time than the rows having OwnerKey with be preferred, that is why I am using "OwnerKey desc" in Rank function.
declare @ownerKey int = 40000
select PropertyKey, BoughtDate, OwnerKey, GroupKey
from (
select PropertyKey, BoughtDate, OwnerKey, GroupKey,
RANK() over (partition by PropertyKey order by BoughtDate desc, OwnerKey desc, GroupKey desc) as [Rank]
from PropertyOwners
) as result
where result.[Rank]=1 and result.[OwnerKey]=@ownerKey
It is taking 2-3 seconds to get the records which is too slow, similar time it is taking as I try to get the records using the GroupKey. But when I tried to get the records for the PropertyKey with the same query, it is executing in 10 milliseconds.
May be the slowness is due to as OwnerKey/GroupKey in the table can be null and sql server in unable to index it. I have also tried to use the Indexed view to pre ranked them but I can't use it in my query as Rank function is not supported in indexed
view.
Please note this table is updated once a day and using Sql Server 2008 R2. Any help will be greatly appreciated.create table #result (PropertyKey int not null, BoughtDate datetime, OwnerKey int null, GroupKey int null, [Rank] int not null)Create index idx ON #result(OwnerKey ,rnk)
insert into #result(PropertyKey, BoughtDate, OwnerKey, GroupKey, [Rank])
select PropertyKey, BoughtDate, OwnerKey, GroupKey,
RANK() over (partition by PropertyKey order by BoughtDate desc, OwnerKey desc, GroupKey desc) as [Rank]
from PropertyOwners
go
declare @ownerKey int = 1
select PropertyKey, BoughtDate, OwnerKey, GroupKey
from #result as result
where result.[Rank]=1
and result.[OwnerKey]=@ownerKey
go
Best Regards,Uri Dimant SQL Server MVP,
http://sqlblog.com/blogs/uri_dimant/
MS SQL optimization: MS SQL Development and Optimization
MS SQL Consulting:
Large scale of database and data cleansing
Remote DBA Services:
Improves MS SQL Database Performance
SQL Server Integration Services:
Business Intelligence -
Update query not working in the JDBC sender Communication channel
Hi,
We are working on JDBC to File scenario. As per the configuration, XI should pick the data from SQL database every 20 secs and should update the corresponding flag. We are using subquery in the select and update statement as both header and detail tables are involved.
Now the issue is, select query is working fine but update statement is not working as expected. It is somehow updating some other records rather than doing for the ones selected by the adapter.
Moreover logSQLstatement is also not working. Hence we are unable to identify the records which are getting updated.
Please advise.Hi Rumi,
See Question 8. Transaction Handling (Sender) in [SAP Note 831162 - FAQ: XI 3.0 / PI 7.0 / PI 7.1 JDBC Adapter|https://websmp130.sap-ag.de/sap(bD1wdCZjPTAwMQ==)/bc/bsp/spn/sapnotes/index2.htm?numm=831162].
8. Transaction Handling (Sender)
Q: If I have the following configured in a JDBC Sender:
Select Query:
SELECT column FROM TABLENAME WHERE FLAG = "TRUE"
Update Query:
UPDATE TABLENAME SET FLAG = "FALSE" WHERE FLAG = "TRUE"
How do I know that the JDBC adapter will not update newly added rows (rows that were
added between the time that the SELECT and UPDATE queries were executed) that were
not read in the initial SELECT query?
A: The SELECT and the UPDATE are run in the same DB transaction, i.e. both statements
have the same view on the database.
Make sure that both statements use the same WHERE clause. An additional
requirement for the correct operation of this scenario is the configuration of
an appropriate transaction isolation level on the database
(i.e., repeatable_read or serializable). You might also consider using a
"SELECT FOR UPDATE" statement instead of a plain SELECT statement to
ensure proper locking on the database. "SELECT FOR UPDATE"
is not supported in MS SQL database. In this case please make use of an
appropriate transaction isolation level on the database. For more details
please contact your DB vendors.
After, see Transaction Handling Issues in [SAP Note 1039779 - JDBC Adapter issues(Escape character,Transaction handling)|https://websmp130.sap-ag.de/sap(bD1wdCZjPTAwMQ==)/bc/bsp/spn/sapnotes/index2.htm?numm=1039779].
Best Regards.
Pedro Baroni -
Why update query takes long time ?
Hello everyone;
My update query takes long time. In emp ( self testing) just having 2 records.
when i issue update query , it takes long time;
SQL> select * from emp;
EID ENAME EQUAL ESALARY ECITY EPERK ECONTACT_NO
2 rose mca 22000 calacutta 9999999999
1 sona msc 17280 pune 9999999999
Elapsed: 00:00:00.05
SQL> update emp set esalary=12000 where eid='1';
update emp set esalary=12000 where eid='1'
* ERROR at line 1:
ORA-01013: user requested cancel of current operation
Elapsed: 00:01:11.72
SQL> update emp set esalary=15000;
update emp set esalary=15000
* ERROR at line 1:
ORA-01013: user requested cancel of current operation
Elapsed: 00:02:22.27Hi BCV;
Thanks for your reply but it doesn't provide output, please see this.
SQL> update emp set esalary=15000;
........... Lock already occured.
>> trying to trace >>
SQL> select HOLDING_SESSION from dba_blockers;
HOLDING_SESSION
144
SQL> select sid , username, event from v$session where username='HR';
SID USERNAME EVENT
144 HR SQL*Net message from client
151 HR enq: TX - row lock contention
159 HR SQL*Net message from client
>> It does n 't provide clear output about transaction lock >>
SQL> SELECT username, v$lock.SID, TRUNC (id1 / POWER (2, 16)) rbs,
2 BITAND (id1, TO_NUMBER ('ffff', 'xxxx')) + 0 slot, id2 seq, lmode,
3 request
4 FROM v$lock, v$session
5 WHERE v$lock.TYPE = 'TX'
6 AND v$lock.SID = v$session.SID
7 AND v$session.username = USER;
no rows selected
SQL> select MACHINE from v$session where sid = :sid;
SP2-0552: Bind variable "SID" not declared. -
Oracle 9.2.0.6; query hangs if partition doesn't exist
Hallo all,
this is the first time I post on this forum.
I work in a group of PL\SQL developers in Italy. Few day ago we had a problem with a query and like to find out what the problem is.
We have an Oracle DB version 9.2.0.6 (old I know) in a production environment. Linux OS.
The query was made to extract data from a partitined table, on a partioned field, in our casa one Year. By mistake we have serced for the wrong year, 2013. There where no data for that year and therefor no partition.
So, happened that the query hangs and after 24 hours was terminated.
What we expected indeed was a zero records retirned in, at the most, few minutes, see that the table, in severa partition contains about 16 million records.
The we tested the same query but in a different enviroment, Oracle 11gr2, same table structure, same partitioning, without partition 2013, and the query completed in less tha 1 minute with zero records in output.
At this point we thought of a bug, but can't find any reference.
Has anyone had a similar experience or can give some indication of possible bug report.
Thanks for any help.Hi Rob,
thank you for your answer.
Sorry if this is not the best forum. I am not very practical.
I try to answer to your questions.
At a first time we thought the query did a full scan on the table. Yes. But even to full scan 16.000.000 records split in no more than 8 partition (at this time) shouldn't take up to 24 hours and never stop running. I think.
We don't have a DBA role so we do not have full control over what is running. And take too long time to open a ticket and ask the DBA to check.
What we did is testing the same query in a pre-prod environment, which is an Oracle 11gr2.
I understand that it is not very usual to have a pre-production environment with a latest version of oracle but this is the way we have to work.
Anyway, the test in pre-production worked very well. Without 2013 partition the return was very fast and we had zero records as expected.
Then we found a workaround for production, ora 9. Call it work around maybe is too much ........
We created the 2013 partition and run the query. The respons was then succesfull in about the same time than in pre-prod. Less than one minute and zero records.
And this is fine for us.
What we don't understand is why this different behavior with two different version of DB. Thats why we think it is due to a bug. We only want to find out whether it is this or if there is a different reason.
Some other response or help would help.
Thank you. -
How does Oracle 8i handle record locking?
Is this handled completely in the background by oracle or are there explicit record locks that can be set.
I understand that an update or insert will lock the current record and the commit and rollback will release the lock.
I have a problem where some developers are using an odbc connection to access an oracle database while a java servlet app is accessing the same database using jdbc. At times the changes made through the servlet app are rolled back or are not processed and the changes made by the odbc connection are kept.
I am confused as to how this could happen.
any suggestions?I have a simmilar problem, where my program aborts too often with a record Lock.
Everytime I do an update/delete I do it using the SELECT .... FOR UPDATE NOWAIT. In order to reduce the number of aborts due to record locks I'd like to try your suggestion of catching the ROW_LOCKED error, sleep(dbms_lock.sleep in PL/SQL), and retry getting the lock a certain amount of times prior to erroring out. Can You give me more details of how to do this.
In paticular how do you use dbms_lock.sleep function/package? where can I find this package? Can you share any code examples where you have used this package.
I greatly appreciate all teh help/suggestions you can provide to me.
Thanks. -
Hi All,
I having block level 8000 records, I Scroll down from First record to last record it is takeing more time.
I Observed tkproof while scrolling two select statments are running..
1) pre-query block level
2) For update query
For update query -> How is is forming? Any Property or some else?
I am not able to find the second query..where it is forming..How to restrict the second query.
Query Array size - 10
Number of records buffered - 10
Number of records Displayed - 10
Query all records - No
Locking mode - Immediate
Key mode - Automatic
Version - Oracle 10g
Plz ........anyThe for update -query is generaetd by forms when its locking the record. If you didn't change anything in the record "by hand", check if there is some code in the POST-QUERY-trigger which forces the record to be locked. if its the POST-QUERY you can issue the following command to avoid the lock at the end of the POST-QUERY:
SET_RECORD_PROPERTY(:SYSTEM.TRIGGER_BLOCK, :SYSTEM.TRIGGER_RECORD, STATUS, QUERY_STATUS); -
hi everyone,
We have a 9i database that sometimes experiences several times per day where the user tries to save a work order only to have to app crash with a 'record in use' error.
I searched \bdump\alert to see if I could find any loging for locks - didn't find any.
Are severe record locks - severe enough to cause an update to fail - logged to a file? looking for a historical "hard-copy" because when I've looked at dba_blockers, v$locked_object etc I don't see any at that time.
Thanks,
JohnFrom an Oracle perspective, there is no such thing as a row-level lock that would cause an application to crash. I'm also not aware of any Oracle error with the words "record in use" in it, so this is probably an application-specific error and an application-specific crash. If this is a custom app, you probably want to modify the code so that it doesn't crash when a row is locked.
Logging every lock of a row would be a substantial burden on scalability, so I don't believe there is any option to do this. If the application waits long enough to acquire the lock, you may be able to set up a job to query DBA_BLOCKERS/ DBA_WAITERS frequently enough to catch the error. But if the application isn't waiting for the lock, that's probably not going to work.
Justin -
Insert and update query to calculate the opening and closing balance
create table purchase(productid number(5) ,dateofpurchase date,
qty number(5));
create table inventory(invid number(5),productid number(5),
idate date,openingqty number(5),closingqty number(5));
Records in inventory:
1,1,'01-jan-2009', 10, 20
2,1,'03-jan-2009', 20, 30
3,1,'04-jan-2009', 40, 50
when I enter the purchase invoice for 15 qty on 02-jan-2009
after say '15-jan-09' , a new record should get inserted
with opening balance = (closing balance before 02-jan-2009)
and all the opening and closing balance for that product should
get affected.
If the invoice for 20 qty is entered for the existing date say
'03-jan-2009' in inventory , then the closing balance
for 03-jan-2009 should get updated and all the following records
should get affected.
I need the insert for the first one and update query for the
second one.
Vinodh<strike>You can do this in one statement by using the merge statement</strike>
Hmm, maybe I spoke too soon.
Edited by: Boneist on 25-Sep-2009 13:56
Thinking about it, why do you want to design your system like this?
Why not simply have your purchases table hold the required information and then either work out the inventory on the fly, or have a job that calls a procedure to add a row for the previous day?
If you continue with this design, you're opening yourself up to a world of pain - what happens when the data doesn't match the purchases table? Also when is the inventory cut-off to reset the opening/closing balances? Monthly? Annually? Weekly? If it's set to one of those, what happens when the business request the inventory for a particular week?
Edited by: Boneist on 25-Sep-2009 13:59
Maybe you are looking for
-
Photo title and description does not display
I have a site created in dreamweaver, I used photoshop to create a web photo gallery. The title and description although entered as file info and directly as html will not display when the gallery is loaded. Help please?? Is there a script problem? H
-
IWeb site suddenly won't publish to MobileMe
Have been publishing my iWeb site successfully with iLife '09 and Snow Leopard for a couple of months now. Yesterday I added a page and published successfully. Then I made changes to some already published pages. These pages are mostly photos and I c
-
Error 64 - the specified network name is no longer available
I am with the problem how error 64 system error 64 - the specified network name is no longer available in my computers My servidor is Windows server 2008 R2 and my computer is windows 7. I tried HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\la
-
Hi, I'm writing this XML and XSL code and it's running perfectly on "XMLSPY" but when i use it on Oracle portal I receive the error the page could not be displayed plz fine the XML and XSL file hereunder: -----XML----- <?xml version="1.0" encoding="I
-
SCOM 2012 Monitoring of windows based service
Hi, Here my requiremt is to monitoring windows based service in scom 2012. The agent server is a windows based machine and I need to monitor these service, once they are in stopped state or in starting state. The server state is ahowing healthy. Coul