ETL更新数据时,SSIS中的“查阅”(Lookup)组件经常用到,在使用查询组件筛选数据进行数据更改(Update)时,如果没有使用好查阅组件的缓存功能,会造成数据表死锁,这样数据流程就卡在数据更新的节点上,导致数据流程无法成功执行完毕。需要注意的是,本文中的“查询(Lookup)”和“更新(Update)”的数据表为同一数据表。

下面举一日常实例进行解读:

利用缓存避免ETL更新数据造成死锁

上图为整个EMP资料更新的尾部工作,EMP代指公司职员信息表,图中流程所做的实际工作为:从HR系统获取职员信息(以下简称“HR Data”)后,需要对EKPI现有的EMP表数据(以下简称“EMP Data”)进行判定,即如果HR Data的数据在Emp Data中已经存在,则将该存在的数据在EMP表中更新,否则作为新的数据加入EMP。

一些案例中经常有这样存在问题的做法是:“查阅EMP”组件选用“部分缓存”对全表数据进行筛选,如果后续未对EMP表数据更新或插入尚可,但若后续同时对EMP表数据更新或插入,这样就有很大的可能性造成死锁。因为部分缓存模式下,数据流开始时缓存还是空的。当时数据流开始执行后,当查阅组件需要根据输入行找匹配数据的时候,这时查阅组件会先检查一下缓存有没有匹配的数据,如果没有就查询数据库,如果在数据库中查到匹配的数据行的时候就把这个数据行缓存起来,以便下次使用。当更新数据库和查询数据库同时进行时,更新的数据记录与查询的数据记录相同时,便发生死锁,数据更新便无法完成。

可取的做法是,将“查阅”组件选用“完全缓存”模式,因为“完全缓存”模式下,在数据流 Data flow 真正执行之前就会将表中的数据或者对应查询结果的数据一次性的从数据源中将数据缓存到内存中,这样不管下面的数据如何更新,都不会影响查阅组件中的数据表,从而避免了发生死锁的可能。

更多关于查阅组件介绍,推荐阅读:SSIS 系列 - Lookup 组件的使用与它的几种缓存模式 - Full Cache, Partial Cache, NO Cache

空非易文章均为原创,转载请以链接形式注明本文地址

本文地址:http://pengzhiyong.com/archives/caching-deadlock-etl-data.html

作者:空非易 | 标签: | 浏览:1761