SQL Server:其他用户的事务锁定表吗?
Posted
技术标签:
【中文标题】SQL Server:其他用户的事务锁定表吗?【英文标题】:SQL Server : are transaction locking table for other users? 【发布时间】:2018-07-13 11:53:27 【问题描述】:当我运行多个查询时,事务是否会锁定我的表?
示例:如果另一个用户尝试在我使用事务的同时发送数据,会发生什么?
另外我怎样才能避免这种情况,还要确保所有数据都已成功插入数据库?
Begin Tran;
Insert into Customers (name) values(name1);
Update CustomerTrans
set CustomerName = (name2);
Commit;
【问题讨论】:
事务就是这样做的,它们锁定表。您无法避免表锁定,这是设计使然。 ***.com/questions/12608780/… 我还建议使用TRY...CATCH
和ROLLBACK
,而不仅仅是没有错误处理的BEGIN TRANSACTION...COMMIT
。
Understanding SQL Server LOCKS on SELECT queries的可能重复
SQL Server 事务具有 ACID 属性,并且数据永远不会处于半完成状态。因此,只要您使用事务,您就不必担心数据半途而废或损坏。 SQL Server Transactions 的 ACID 属性确保“全部完成或什么都不做”。你必须信任 sql server。
【参考方案1】:
您必须巧妙地实施交易。以下是一些与性能相关的要点:-
-
锁定乐观/悲观。在悲观锁定中,整个表被锁定。但在乐观锁定中,只有特定的行被锁定。
隔离级别已提交读/未提交读。当表被锁定时,取决于您的业务场景是否允许,然后您可以使用 NoLock 进行脏读。
尝试在更新中使用 where 子句并进行适当的索引。对于任何繁重的查询,请检查查询计划。
事务超时应该非常少。因此,如果表被锁定,那么它应该抛出错误并且在 catch 块中你可以重试。
您可以做到以下几点。
【讨论】:
第二项通常是大型环境中的解决方案,尤其是针对稀疏更新/历史数据报告的存储过程。不幸的是,人们经常看到使用 NO LOCK 并将其视为性能提升,而实际上它是避免死锁的“最后手段”机制。【参考方案2】:您无法避免多个用户将数据加载到数据库。每次单个用户请求使用表时锁定既不可行也不聪明。其实你不必担心,因为数据库本身会提供机制来避免此类问题。我建议您阅读 ACID 属性。
原子性 一致性 隔离 耐用性可能发生的情况是您可能会遭受幻读,这基本上包括您无法读取数据,除非插入数据的用户提交。即使您已经完成插入数据并且没有提交,您也很有可能看不到更改。
创建、删除等 DDL 操作本身在最后提交。但是DML操作,如更新、插入、删除等,最后都不会提交。
【讨论】:
显示事务不会阻止其他用户在同一个表中使用事务对吗? 取决于锁定的类型。有不同的锁定范围。从单个寄存器,行到整个表。以上是关于SQL Server:其他用户的事务锁定表吗?的主要内容,如果未能解决你的问题,请参考以下文章