
1.锁机制在多用户数据库系统中用户可以锁定一个对象可以防止其他用户修改锁定的对象多个并发用户访问数据库数据的情况下为了保证数据的完整性锁是必需的锁作为关联到数据项的对象程序可以显示对数据加锁数据库系统也可以隐式的对对象进行加锁2.锁的分类Shared locks: 共享锁多个用户可以同时读取相同的记录Exclusive locks: 排他锁同一时间仅仅有一个用户可以读取相同的记录Promotable (Update) lock: 提升锁可以升级 (从共享锁提升为排他锁) 或者降级Intent lock: 专一锁是一种表级锁标识在该表上有一个游标在读取数据3.锁的类型介绍1共享锁lock-S如果一个对象上没有排他锁则共享锁可以加在该对象上防止其他事务更新数据但同时其他事务可以读取该数据 (其他事务可以加共享锁)多个事务可以在同一个对象上加多个共享锁2排他锁 (lock-X)如果记录上没有任何锁排他锁才可以加在该对象上一旦在记录上加了排他锁则不能在该记录上增加任何锁了直至锁释放防止其他事务读取和更修数据3更新锁 (lock-U)在更新Cursor中使用更新锁由cursors 含有 ‘for update’ 选项执行时产生的 只能在没有排他锁或者更新锁的记录上加更新锁当锁定的记录真正执行的时候更新锁将提升为排他锁4专一锁 (lock-IX or IS)由IDS自动分配如果一条记录上的记录被更新一个排他锁将分配在该记录上同时将该记录的表上自动加上专一锁这能保证没有session可以在该表上增加排他锁只要该表中有记录被增加了排他锁4.锁的兼容矩阵SXSTRUEFALSEXFALSEFALSE5.锁的有效期程序控制数据库锁的有效期当数据库关闭后数据库锁将被释放根据数据库是否使用了事务的情况表锁的有效期不同【如果数据没有使用事务没有事务日志也不使用commit work语句显示对一个表lock当执行unload table时锁将被释放;】当数据库使用了事务事务结束时将释放事务所有的锁 table, row, page, and index locks6.锁的粒度及应用1锁的粒度介绍锁粒度 说明数据库锁 针对整个数据库的锁表锁 针对整个表的锁页锁 针对整页数据的锁行锁 针对一个数据行的锁字节锁 在包含varchar的行上的锁键锁 在索引中的一个键值上的锁2不同锁粒度的应用一般来讲锁的粒度越大并发性就越低程序控制将越简单。数据库锁应用数据库管理活动比如 imports 和 exports表锁应用当整个表或者表的大部分数据需要更新加表级锁效率高页级锁应用当按数据物理顺序进行访问和更新时页级锁效率高行级锁应用OLTP 事务采用行级锁效率高以下语句将隐式的对表加锁直到事务结束后释放:ALTER FRAGMENTALTER INDEXALTER TABLECREATE INDEX (if not using ONLINE keyword)DROP INDEX (if not using ONLINE keyword)RENAME COLUMNRENAME TABLE3哪种锁粒度是最优的取决于事务本身的特点当更新表中相对较小一部分数据的时候采用行级锁将获取最好的性能如果一个事务只访问表中一小部分数据那就采用行级锁如果一个事务频繁的访问整个表的数据设置更粗的粒度比如表级锁如果更新数据库中大部分表的大部分数据的情况下, 采用数据库级别的锁4关于查看锁及事务情况的指令查看表锁模式:oncheck –pt dbname:tablenamedbschema –d dbname –t tablename -ss查看用户进程锁等待情况使用: onstat –u查看锁使用和等待情况使用: onstat -k监控数据库事务及其状态使用: onstat -x