锁(Lock):当系统中有用户并发操作时,用于保护数据一致性的机制。可以保证不同用户访问到的是正确的信息。
1.TD四种类型的锁
(1)EXCLUSIVE
排它锁,级别最高。持有此锁时,其它任何新申请锁均需等待。一般是DDL操作,如create、drop、alter数据库/表/视图等。
(2)WRITE
写锁,级别第二。持有此锁时,新申请的READ、WRITE、EXCLUSIVE锁需等待,仅ACCESS锁无需等待。一般是DML操作中的insert、update和delete。
(3)READ
读锁,级别第三。持有此锁时,新申请的WRITE、EXCLUSIVE锁需等待,ACCESS、READ锁无需等待。一般是DML操作中的select。
(4)ACCESS
访问锁,级别最低。持有此锁时,仅新申请的EXCLUSIVE锁需等待。
2.TD锁的作用域
Teradata锁作用域的基本原则是,在保证数据完整性的前提下,尽可能小范围地上锁。此外,Teradata在处理SQL语句时,会自动指定锁的类型以及锁的作用域。下表中N/A表示Not Available,即不存在这种情况;FTS表示FULL TABLE SCAN,即全表扫描。
(1)Row Hash
记录级,只锁定具备相同Row Hash值的记录。在SQL语句中提供了主索引或者唯一次索引时使用,因为可以根据索引值可计算出 ROW HASH 值。
(2)Table/View
表级,锁定全表或全视图所有数据。
(3)Partition
分区级,锁定指定分区所有数据。数据库版本15.10引入。
(4)Database
数据库级,锁定数据库所有表和视图。
3.改变锁的类型
可以通过下面命令降低或者提高锁等级,所有等级的锁均可以提高,但降低锁等级只可以把Read降为Access,其它等级不能降低。
LOCKING ROW FOR ACCESS SELECT * FROM Table_A; //由Read锁降为Access锁 LOCKING TABLE Table_B FOR EXCLUSIVE UPDATE Table_B SET A = 2007; //由Write锁升为Exclusive锁 LOCKING TABLE Table_C FOR WRITE NOWAIT UPDATE Table_C SET A = 2008; //NOWAIT选项表示如果无法获取锁,则语句将被中止,并报7423错误。
总之:针对 update ,insert ,delete等SQL语句一定要及进commit。针对表的查询尽量用视图屏蔽其锁机制。