Tôi đã chèn hai tập dữ liệu, sử dụng ghi nhật ký tối thiểu, vào một bảng heap trống bằng cách sử dụng thông qua hai Nhiệm vụ SQL thực thi chạy song song và với SQL có dạng sau.
INSERT INTO Table (TABLOCK) SELECT FROM ...
Sau khi công việc bị treo một chút, một trong các tác vụ SQL đã trở thành nạn nhân bế tắc. Dưới đây là đầu ra XML của biểu đồ khóa chết.
Ai đó có thể giải thích những gì đã xảy ra dưới mui xe?
<resource-list>
<objectlock lockPartition="0" objid="1586156746" subresource="FULL" dbid="7" objectname="dbo.TargetTable" id="lock7374a00" mode="IX" associatedObjectId="1586156746">
<owner-list>
<owner id="process9609dc8" mode="Sch-S"/>
<owner id="process9609dc8" mode="IX"/>
</owner-list>
<waiter-list>
<waiter id="process5e13048" mode="X" requestType="convert"/>
</waiter-list>
</objectlock>
<objectlock lockPartition="0" objid="1586156746" subresource="FULL" dbid="7" objectname="dbo.TargetTable" id="lock7374a00" mode="IX" associatedObjectId="1586156746">
<owner-list>
<owner id="process5e13048" mode="Sch-S"/>
<owner id="process5e13048" mode="IX"/>
</owner-list>
<waiter-list>
<waiter id="process9609dc8" mode="X" requestType="convert"/>
</waiter-list>
</objectlock>
</resource-list>
Mọi thứ trở nên phức tạp hơn nhiều vì tôi thấy rằng trong hầu hết các trường hợp, hai Nhiệm vụ SQL thực thi có thể chạy song song thành công. Hãy thử dưới đây:
Create table dbo.TablockInsert (c1 int, c2 int, c3 int)
--then issue the script in two Execute Sql Task in parallel you won't fail:
insert into dbo.TablockInsert(TABLOCK) SELECT 1, 1, 1
Vì sự khác biệt duy nhất là câu lệnh CHỌN ... TỪ ..., có vẻ như câu lệnh CHỌN ... TỪ ... có thể có tác động đến chế độ khóa ở đây không?