我有一个带有开始结束块的存储过程。例如,该块中的select语句和更新语句很少。
在这个开始块中,是根据它们的编写方式一起执行所有sql还是按顺序执行?
begin
select stmt
update stmt
select stmt
.
.
end
答案 0 :(得分:1)
存储过程中的语句按顺序执行。
你唯一不知道ordet和可以并行执行的东西是每个语句内部的不同子步骤。
例如,在:
SELECT a, b
FROM table t
INNER JOIN other o
ON o.id = t.id
INNER JOIN third d
ON d.o_id = o.o_id
WHERE t.b = 123
UPDATE t
SET x = 123
FROM table t
WHERE t.b = 234
选择将始终在更新之前执行,但是在select语句中,您不知道'table'是先与'other'连接,还是以'third'连接,或者如果'other'连接在一起用'第三'然后用'表'。
答案 1 :(得分:0)
开始中的所有语句 - 按顺序执行结束块。 我遇到过这个死锁问题,可能因为程序必须在多个线程中运行。
如果这可以在单个或2-3个线程中执行,并且事务很小,那么进程可以在它升级到死锁之前等待。或者添加带有错误编号的try catch块以便在死锁错误时重试更新。