LOCK - 明确地锁定一个表
SYNOPSIS
LOCK [ TABLE ] name [, ...] [ IN lockmode MODE ]
where lockmode is one of:
ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE
| SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE
DESCRIPTION 描述
LOCK TABLE 获取一个表级锁,必要时等待任何冲突的锁释放。 一旦获取了这个锁,它就会在当前事务的余下部分一直保持。 (没有 UNLOCK TABLE 命令;锁总是在事务结尾释放。)
在为那些引用了表的命令自动请求锁的时候,PostgreSQL 总是尽可能使用最小限制的锁模式。LOCK TABLE 是为你在需要更严格的锁的场合提供的。 例如,假设一个应用在读已提交隔离级别上运行事务, 并且它需要保证在表中的数据在事务的运行过程中都存在。要实现这个目的, 你可以在查询之前对表使用 SHARE 锁模式进行锁定。 这样将保护数据不被并行修改并且为任何更进一步的对表的读操作提供实际的当前状态的数据, 因为 SHARE 锁模式与任何写操作需要的 ROW EXCLUSIVE 模式冲突, 并且你的 LOCK TABLE name IN SHARE MODE 语句将等到所有并行的写操作提交或回卷后才执行。因此,一旦你获得该锁,那么就不会存在未提交的写操作.
如果运行在可串行化隔离级别并且你需要读取真实状态的数据时, 你必须在执行任何数据修改语句之前运行一个 LOCK TABLE 语句。 一个可串行化事务的数据图象将在其第一个数据修改语句开始的时候冻结住。 稍后的 LOCK TABLE 将仍然阻止并发的写 --- 但它不能保证事务读取的东西对应最近提交的数值。
如果一个此类的事务准备修改一个表中的数据,那么应该使用 SHARE ROW EXCLUSIVE 锁模式,而不是 SHARE 模式。 这样就保证任意时刻只有一个此类的事务运行。不这样做就可能会死锁: 当两个并行的事务可能都请求 SHARE 模式,然后试图更改表中的数据时, 两个事务在实际执行更新的时候都需要 ROW EXCLUSIVE 锁模式, 但是它们无法再次获取这个锁。(请注意,一个事务自己的锁是从不冲突的, 因此一个事务可以在持有 SHARE 模式的锁的时候请求 ROW EXCLUSIVE 模式--但是不能在任何其它事务持有 SHARE 模式的时候请求。) 为了避免死锁,所有事务应该保证以相同的顺序对相同的对象请求锁, 并且,如果涉及多种锁模式,那么事务应该总是最先请求最严格的锁模式。
有关锁模式和锁定策略的更多信息,请参考 Section 12.3 ``Explicit Locking'' 。
PARAMETERS 参数
- name
- 要锁定的现存表的名字(可以有模式修饰)。
命令 LOCK a, b; 等效于 LOCK a; LOCK b;。 表是按照 LOCK 命令中声明的顺序一个接一个顺序上锁的。
- lockmode
- 锁模式声明这个锁和那些锁冲突。锁模式在 Section 12.3 ``Explicit Locking'' 里描述。
如果没有声明锁模式,那么使用最严格的模式 ACCESS EXCLUSIVE。
NOTES 注意
LOCK ... IN ACCESS SHARE MODE 需要在目标表上有 SELECT 权限。所有其它形式的 LOCK 需要 UPDATE 和/或
DELETE 权限。
LOCK 只是在一个事务块的内部有用 (BEGIN...COMMIT),因为锁在事务结束的时候马上被释放。 出现在任意事务块外面的 LOCK
都自动生成一个自包含的事务,因此该锁在获取之后马上被丢弃。
LOCK TABLE 只处理表级的锁,因此那些有 ROW
字样的锁都是用词不当。这些模式名字通常应该应该理解为用户视图在一个被锁定的表中获取行级的锁。 同样 ROW EXCLUSIVE 模式也是一个可共享的表级锁。
我们一定要记住,只要是涉及到 LOCK TABLE, 那么所有锁模式都有相同的语意,区别只是它们与哪种锁冲突的规则。
EXAMPLES 例子
演示在往一个外键表上插入时在有主键的表上使用 SHARE 的锁:
BEGIN WORK;
LOCK TABLE films IN SHARE MODE;
SELECT id FROM films
WHERE name = 'Star Wars: Episode I - The Phantom Menace';
-- Do ROLLBACK if record was not returned
INSERT INTO films_user_comments VALUES
(_id_, 'GREAT! I was waiting for it for so long!');
COMMIT WORK;
在执行删除操作时对一个有主键的表进行 SHARE ROW EXCLUSIVE 锁:
BEGIN WORK;
LOCK TABLE films IN SHARE ROW EXCLUSIVE MODE;
DELETE FROM films_user_comments WHERE id IN
(SELECT id FROM films WHERE rating < 5);
DELETE FROM films WHERE rating < 5;
COMMIT WORK;
LOCK - 明确地锁定一个表的更多相关文章
- sqlserver2008锁表语句详解(锁定数据库一个表)
锁定数据库的一个表 复制代码代码如下: SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别 复制代码代码如下: SELECT * FROM tab ...
- atitit查询表修改表字段没反应--解锁锁定的表
atitit查询表修改表字段没反应--解锁锁定的表 查询表修改表字段没反应 要是使用gui 没反应,最好使用cmd 方式,不卉不个gui 锁上.. ALTER TABLE t_mb_awardweix ...
- atitit查询表改动表字段没反应--解锁锁定的表
atitit查询表改动表字段没反应--解锁锁定的表 查询表改动表字段没反应 要是使用gui 没反应,最好使用cmd 方式,不卉不个gui 锁上.. ALTER TABLE t_mb_awardweix ...
- SQL中锁表语句简单理解(针对于一个表)
锁定数据库的一个表 复制代码代码如下: SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别 复制代码代码如下: SELECT * FROM tab ...
- 使用oracle数据库,多用户同时对一个表进行增加,删除,修改,查看等操作,会不会有影响?
使用oracle数据库,多用户同时对一个表进行增加,删除,修改,查看等操作,会不会有影响? 1.问题:各操作间或者性能上会不会有影响? 如果有该如何解决? 多用户操作的影响主要是回锁定记录,oracl ...
- Oracle多用户对一个表进行并发插入数据行操作
oracle数据库支持多用户间同时对同一个表进行操作,但是数据不一定同步,因为oracle数据库是支持脏数据的,比如A用户删除了表的数据但没有提交,B用户也能查询访问到,如果要避免这种情况只能加锁,A ...
- mysql锁定单个表的方法
mysql锁定单个表的方法mysql>lock table userstat read;mysql>unlock tables; 本文来自ChinaUnix博客,如果查看原文请点:http ...
- SQL存在一个表而不在另一个表中的数据, 更新字段为随机时间
--更新字段为随机时间 86400秒=1天 UPDATE dl_robot ), ,GETDATE()) ) SQL存在一个表而不在另一个表中的数据 方法一 使用 not in ,容易理解,效 ...
- [SQL]复制数据库某一个表到另一个数据库中
SQL:复制数据库某一个表到另一个数据库中 SELECT * INTO 表1 FROM 表2 --复制表2如果只复制结构而不复制内容或只复制某一列只要加WHERE条件就好了 例子:SELECT * I ...
随机推荐
- [LeetCode]-010-Regular_Expression_Matching
Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...
- 【每日一包0007】array-range
[github地址:https://github.com/ABCDdouyae...] array-range 生成一个指定起始位置的固定长度的数组 用法:array-range(start, end ...
- 火狐使用阿里云OOS上传图片报错:“XML 解析错误:找不到根元素”
问题描述: 使用阿里云OOS上传图片在火狐浏览器报错 "XML 解析错误:找不到根元素",但不影响功能的使用.阿里云返回信息: <Error> <Code> ...
- 记一次全局分区索引update调优
原始SQL: CREATE OR REPLACE PROCEDURE sp_upd_suppressed_emails( A_LIMIT_BULK IN PLS_INTEGER DEFAULT 20 ...
- 网络协议之FTP协议
FTP(File Transfer Protocol) 协议文档:RFC 959 1.1 FTP协议介绍 FTP协议基于TCP/IP协议实现,处于应用层. FTP协议为C/S架构,每一次FTP连接,命 ...
- 使用Choose构建分支动态语句
1.在接口写方法 public List<Employee> getEmpsByConditionChoose(Employee employee); 2 在映射文件中配置 <!-- ...
- Mybaits查询返回值是List类型的
查询返回值是list类型的 1 首先在接口中写方法 public interface EmployeeMapper { public List<Employee> getEmpsByLas ...
- org.hibernate.MappingException: An AnnotationConfiguration instance is required to use <mapping clas
在Hibernate中使用annotation出现错误.如题目所示. HibernateSessionFactory类中: // private static Configuration co ...
- 测试-修补程序-Hotfix:百科
ylbtech-测试-修补程序-Hotfix:百科 1.返回顶部 1. Hotfix是微软公司研发的一个程序,针对某一个具体的系统漏洞或安全问题而发布的专门解决该漏洞或安全问题,通常称为修补程序. ...
- Linux centos 解决"不在 sudoers 文件中。此事将被报告"的问题
第一部分讲解如何从普通用户到root用户 网上看了很多,其实就是执行 su root ,然后输入当前用户密码,这个时候可能报错 这个问题不大,执行一下提示的语句: abrt-auto-reportin ...