SQL Server:事务锁定表是否适用于其他用户



当我运行多个查询时,事务会锁定我的表吗?

示例:若另一个用户试图在我使用事务的同一时间发送数据,会发生什么?

此外,我如何避免这种情况,同时确保所有数据都已成功插入数据库?

Begin Tran;
Insert into Customers (name) values(name1);
Update CustomerTrans 
set CustomerName = (name2);
Commit;

您必须巧妙地实现事务。以下是一些与性能相关的要点:-

  1. 锁定乐观/悲观。在悲观锁定中,整个表被锁定。但在乐观锁定中,仅锁定特定行
  2. 隔离级别已提交读取/未提交读取。当表被锁定时,这取决于您的业务场景。如果允许,那么您可以使用NoLock进行脏读
  3. 请尝试在更新中使用where子句并进行正确的索引。对于任何繁重的查询,请检查查询计划
  4. 事务超时应该非常少。因此,如果表被锁定,那么它应该抛出错误并在捕获块中重试

这是你可以做的几点。

您无法避免多个用户将数据加载到数据库中。每当一个用户请求使用一个表时都进行锁定,这既不可行,也不明智。实际上,您不必担心,因为DB本身将提供避免此类问题的机制。我建议您阅读ACID属性。

  • 原子性
  • 一致性
  • 隔离
  • 耐久性

可能发生的情况是,您可能会遭受重影读取,这基本上意味着除非插入数据的用户提交,否则您无法读取数据。即使您已经完成了插入数据并且没有提交,您也很有可能看不到更改。

DDL操作(如创建、删除等(本身在最后提交。然而,DML操作,如更新、插入、删除等,最终都没有提交。

最新更新