gpt4 book ai didi

sql - 当存在打开事务时,如何避免 SQL 查询超时错误?

转载 作者:行者123 更新时间:2023-12-03 02:09:08 27 4
gpt4 key购买 nike

我使用以下查询从数据库中检索客户详细信息。

方法一:

BEGIN TRAN
IF EXISTS(SELECT TOP 1 'X' From CUSTOMER Where CustId = @Code AND Status = 'D')
BEGIN
UPDATE CUSTOMER
SET Status = 'L'
WHERE CustId = @BorrowerCode AND ISNULL(Borrower,'') = 'Y'

SELECT CustId, MobileNo, PlaceDesc
FROM CUSTOMER C
JOIN PLACE P ON C.FKID = P.Pk_Id
WHERE Cust_Id = @Code AND C.Status = 'L'
END
COMMIT TRAN

方法2:

BEGIN TRAN
IF EXISTS(SELECT TOP 1 'X' From CUSTOMER Where CustId = @Code AND Status = 'D')
BEGIN
UPDATE CUSTOMER
SET Status = 'L'
WHERE CustId = @BorrowerCode AND ISNULL(Borrower,'') = 'Y'

SELECT CustId, MobileNo, PlaceDesc
FROM CUSTOMER C With(NoLock)
JOIN PLACE P With(NoLock) ON C.FKID = P.Pk_Id
WHERE Cust_Id = @Code AND C.Status = 'L'
END
COMMIT TRAN

如果数据库中有一个打开的事务,则查询将失败并导致方法 1 超时。在事务内使用 NoLock 是一个好习惯吗?

最佳答案

很少的东西..

1.首先你的更新是不可搜索的,你可以尝试如下重写

UPDATE CUSTOMER 
SET Status = 'L'
WHERE CustId = @BorrowerCode AND Borrower = 'Y'

2.超时有相当大的限制,25倍查询成本。所以即使有这个限制,如果你超时,那么一定有什么问题,我们正在尝试使用 nolock 来应用绷带。设置隔离级别到快照,不会导致 select 阻塞,但会带来 tempDB 使用成本、扫描问题(更多信息请参阅下面的链接..)。进一步的隔离级别不适用于 DDL/DML 语句,它们仅适用于 select 语句在您的情况下,开放事务可能意味着某些 DDL/DML 运行很长时间。

总之,我不会使用 nolock,但我宁愿尝试看看为什么会发生超时,并且更改隔离级别也需要一些测试

引用文献: http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/

关于sql - 当存在打开事务时,如何避免 SQL 查询超时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36159070/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com