SQL Server:其他用户的事务锁定表吗?

时间:2018-07-13 11:53:27

标签: c# sql-server

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

示例:如果另一个用户在尝试使用交易的同时尝试发送数据,会发生什么?

我又如何避免这种情况,又要确保所有数据都已成功插入数据库中?

Begin Tran;
    Insert into Customers (name) values(name1);

    Update CustomerTrans 
    set CustomerName = (name2);

Commit;

2 个答案:

答案 0 :(得分:0)

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

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

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

DDL操作(例如创建,删除等)本身在最后提交。但是,DML操作(例如更新,插入,删除等)不会在最后提交。

答案 1 :(得分:0)

您必须巧妙地实现交易。以下是一些与性能有关的要点:-

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

这些是您可以做的几点。