This ensures that only one transaction of this type runs at a time. If a transaction of this sort is going to change the data in the table, then it should use SHARE ROW EXCLUSIVE lock mode instead of SHARE mode. A LOCK TABLE later in the transaction will still prevent concurrent writes - but it won't ensure that what the transaction reads corresponds to the latest committed values. A REPEATABLE READ or SERIALIZABLE transaction's view of data will be frozen when its first SELECT or data modification statement begins. To achieve a similar effect when running a transaction at the REPEATABLE READ or SERIALIZABLE isolation level, you have to execute the LOCK TABLE statement before executing any SELECT or data modification statement. Thus, once you obtain the lock, there are no uncommitted writes outstanding furthermore none can begin until you release the lock. This will prevent concurrent data changes and ensure subsequent reads of the table see a stable view of committed data, because SHARE lock mode conflicts with the ROW EXCLUSIVE lock acquired by writers, and your LOCK TABLE name IN SHARE MODE statement will wait until any concurrent holders of ROW EXCLUSIVE mode locks commit or roll back. To achieve this you could obtain SHARE lock mode over the table before querying. For example, suppose an application runs a transaction at the READ COMMITTED isolation level and needs to ensure that data in a table remains stable for the duration of the transaction. LOCK TABLE provides for cases when you might need more restrictive locking. When acquiring locks automatically for commands that reference tables, PostgreSQL always uses the least restrictive lock mode possible. When a view is locked, all relations appearing in the view definition query are also locked recursively with the same lock mode. (There is no UNLOCK TABLE command locks are always released at transaction end.) Once obtained, the lock is held for the remainder of the current transaction. If NOWAIT is specified, LOCK TABLE does not wait to acquire the desired lock: if it cannot be acquired immediately, the command is aborted and an error is emitted. LOCK TABLE obtains a table-level lock, waiting if necessary for any conflicting locks to be released.
0 Comments
Leave a Reply. |
AuthorWrite something about yourself. No need to be fancy, just an overview. ArchivesCategories |