为什么在“插入查询”之前“开始事务”会锁定整个表?

RPK*_*RPK 6 mysql oracle sql-server sql-server-2005

我写了一个存储过程来插入一条记录。我在插入查询的正上方添加了“开始事务”并执行查询。我注意到另一个应用程序显示一个网页,其中包含来自同一个表的记录,在插入完成时挂起。

为什么开始事务会锁定整个表?作家不应该阻止读者。默认情况下它应该是ON。

我正在使用 SQL-Server 2005 Express。我也想知道 Oracle 和 MySQL 如何处理相同的情况。

Bar*_*t B 4

Begin Transaction 是事务的开始 - 在结束事务之前不能将其他数据写入表中,这是设计使然,以便在数据库上强制执行 ACID 标准。http://en.wikipedia.org/wiki/ACID

如果您需要像单个原子操作一样执行多个查询,则可以使用事务。如果不需要原子性,就不要使用事务!

不过,这是非常非常基本的东西 - 在尝试编写数据库代码之前,您可能需要重新了解基本的数据库理论,如果您不熟悉事务等核心原理,则可能会对应用程序造成严重损害。

  • @Bart:这并不*总是*正确,事务隔离级别可以更改。 (2认同)
  • “在结束交易之前,不能将其他数据写入表中”这是错误的。SQL Server 已经拥有页级和行级锁定非常非常长的时间了。 (2认同)