Ian McNally (icm@infobiz.cityscape.co.uk) wrote: : Currently, we are running into real problems regarding Ingres locking : w.r.t our current policy, i.e shared locking for all. : Is readlock = nolock a viable alternative, and if so, are we in for serious : grief in implementing it? (Yes, I know about dirty reads etc.) READLOCK=NOLOCK is a way to provide dirty reads. However, it requires some specific resources: Whenever a NOLOCK-reader requests a new page from a table within the database server, a (temporary) lock is requested for that page (i.e. it should better be called "READLOCK=NOBLOCK"). Then a block of the buffer manager is reserved exclusively for this thread. The requested page will then be copied to that private block and the lock will be released. In the same way all pages, that the NOLOCK-reader uses, are first copied to the private block. That means: For every table accessed by the given query, a block of the buffer manager is reserved for private use. The actual process of copying will require some (almost negligible) amount of CPU activity. And there are (short time) locks involved! : Incidentally, the locking system is sized currently for 500 concurrent users : and we STILL ran out of lock resources in a test with 100 real concurrent users. How did you configure your locking system: How many locks in the system? How many lock lists? How many locks per transaction? Are you using "SET LOCKMODE ... WHERE MAXLOCKS=..."? If so, how? And what is the actual error message that you get? : This scares me a bit ( well, actually, a lot) : Any help is gratefully received.. Hope, I can help you, if I get more info. - Christopher -- ____________________________________________________________________________ Christopher Etz Kopernikusstr. 28 D-65929 Frankfurt/Main cetz@cetz.rhein-main.de Tel.: +49 69 318091 Telefax: +49 69 318091 icm@infobiz.cityscape.co.uk (Ian McNally) writes: [Snip] I assume that you have read what the Installation Guide and the latest DBA guide have to say about concurrency and lock management. My installation uses readlock=nolock and have had no real problems other than the side effects of dirty reads. You did not say what platform you are running on. Or much about your current lock configuration other than the number of users. Ingres makes some distinctions between how many page locks can be on a table before going to a table lock and how may locks a transaction can have. Also if some of your applications have multiple sessions open you will want to look at the number of locklists your have configured. The defaults that BUILD calculates are based on some rather minimal lock usage per session. The last paragraph rambled a bit. What I mean to say is look at the section in the latest DBA guide on concurrently strategies and locking. Look at you applications in terms of how many locks they really need. This would be driven from the number of joins in a query, how many SQL statements get executed between commits and how many sessions the process has open. You can use IPM to measure the application's actual usage. If you are on certain platforms, like VMS clusters, you will also have to change the platform's locking parameters to allow all those that Ingres will need. It is just as important to analyze the transactions which are causing locks. Perhaps the only hope for doing this is looking at the lock list for specific transactions via IPM or by looking at a lock trace for a specific set of transactions. Poor locking behavior can be caused by the choice of bad storage structures, a bad set of primary keys, a bad secondary index, and the failure to collect optimizer statistics for some columns used in a query. Analyzing locking problems after a system goes into production is very difficult. You need to try and replicate the transactions in a test environment so that you can do all of the tracing and isolate the locking problems. It is very doubtful that your application is behaving perfectly - in my opinion most locking issues are caused by the program, not an overabundance of users trying to do real work. Jerry Helms -- voice 919/380-7252 fax 919/319-9492 In article <39mg4h$r42@ns.cityscape.co.uk> icm@infobiz.cityscape.co.uk "Ian McNally" writes: > Currently, we are running into real problems regarding Ingres locking > w.r.t our current policy, i.e shared locking for all. > Is readlock = nolock a viable alternative, and if so, are we in for serious > grief in implementing it? (Yes, I know about dirty reads etc.) > Incidentally, the locking system is sized currently for 500 concurrent users > and we STILL ran out of lock resources in a test with 100 real concurrent > users. > This scares me a bit ( well, actually, a lot) > Any help is gratefully received.. I used to think that setting readlock=nolock would save on locking resources. However, a little birdy from INGRES told me that readlock=nolock just means that the system creates 'null' locks - it still requires a certain amount of resources to do this. Can anyone at CA confirm this ? ------------------------------------------------------------------------------- Dennis Adams Common Sense Computing (UK) Ltd dennis@comsense.com Canada House, 272 Field End Rd, Eastcote, Middx HA4 9NA Phone: 0181 866 4400 Fax: 0181 429 2848 ------------------------------------------------------------------------------- Dennis Adamswrites: >Can anyone at CA confirm this ? Hi Dennis READLOCK=NOLOCK is not what it first appears it should really be named READLOCK=NOBLOCK A blocking lock is taken out with this setting and a resource is required to do this. NOLOCK also causes each block to be written to a private buffer in the server memory this takes resources. Generally NOLOCK requires more CPU to perform this additional memory block copying - it is not too significant. Regards Julian Ian McNally (icm@infobiz.cityscape.co.uk) wrote: : Currently, we are running into real problems regarding Ingres locking : w.r.t our current policy, i.e shared locking for all. : Is readlock = nolock a viable alternative, and if so, are we in for serious : grief in implementing it? (Yes, I know about dirty reads etc.) READLOCK = NOLOCK is not a panacea. It can help in difficult situations if used properly, but can also cause problems if used inappropriately. Good transaction design is a prerequisite to good concurrent performance. LOCKMODE settings are part of the transaction design. : Incidentally, the locking system is sized currently for 500 concurrent users : and we STILL ran out of lock resources in a test with 100 real concurrent users. Most likely you are seeing a misleading message about the locking system being out of locks, when actually all that has happened is that a lock list has grown to the maximum number of locks allowed in a transaction, forcing an escalation to table level locking on one table. If the escalation deadlocks, the rollback of the transaction is done by the RCP (a PASS_ABORT) and one of the diagnostic error messages written to the error log says that the locking system has run out of locks. What is the exact sequence of messages in your error log when it says you are out of locks? : This scares me a bit ( well, actually, a lot) Be bold! Lots of people use READLOCK = NOLOCK. Very few have trouble with it. Most who do have trouble either forget about dirty reads, or act as if it were a substitute for transaction and/or database design. If this is the first time that you have had to worry about design for concurrency, it would save you a lot of time on the learning curve to get some experienced consulting help. : Any help is gratefully received.. : cheers : ian mc Regards, Jerry glohr@ozemail.com.au [Ed.:- The Man From Uncle...oops, Ingres]
© William Yuan 2000
Email William