【发布时间】:2011-08-03 07:24:00
【问题描述】:
我正在寻找类似于 SQL 事务的东西。我需要交易提供的常规保护,但我不希望它拖慢其他人的速度。
假设客户端 A 连接到数据库并运行这些命令:
BEGIN TRAN
SELECT (something)
(Wait a few seconds maybe.)
UPDATE (something)
COMMIT
在 SELECT 和 UPDATE 之间,客户端 B 出现并尝试进行查询,在正常情况下,最终不得不等待 A 提交。
我希望客户端 A 以这样的方式打开它的事务,如果 B 出现并执行它的查询,客户端 A 会发现它的事务立即回滚并且它的后续命令失败。客户端 B 只会遇到最小的延迟。
(请注意,SELECT 和 UPDATE 只是说明性命令。)
更新...
我有一个高优先级任务(客户端 B)有时(每月一次)会收到 SQL 超时错误,还有一个低优先级任务(客户端 A)的事务导致该超时。我宁愿低优先级的任务失败并在下一个周期重新尝试。
我最终通过完全消除事务并用一组非正式的标志替换它们来解决这个问题。查询被重构为仅在引发正确的标志集时才执行某些操作,并且我添加了一些清除回滚过去会清除的废弃记录的内容。
我通过消除交易解决了我的交易问题。
【问题讨论】:
-
如果您的事务不重要以至于您愿意在后续命令失败的情况下接受回滚,那么为什么还要为事务烦恼呢?
-
事务仍然会阻止半应用事务。当然,如果您想尽量减少时间,
ROLLBACK可能需要与完成交易一样长或更长的时间。 -
“我希望客户 A 向客户 B 开放其交易”——无论从商业角度还是从技术角度来看,这种期望都是没有意义的。它与交易的基本含义相矛盾。
-
@Joe - 比起我的低优先级任务完成时,我可能更关心不保留高优先级任务。
-
@blspr - 相反,这很有意义。 :) B 绝不会进入 A 打开的事务。这就像事务被网络故障中断,数据库会尽职尽责地回滚所有未提交的内容并释放等待查询的块。
标签: sql sql-server transactions