sql - 同时在同一个表中插入和选择

标签 sql sql-server performance database-performance

由于我是 Sql 服务器的新手,有人可以澄清一下吗?

考虑一下这种情况,

我有一个表“dbo.test”,其中包含 1 亿条记录。

在表“dbo.test”上运行10条select语句,每次选择将返回100万条记录。

现在我想向同一个表“dbo.test”插入100万条记录。但我不会选择新数据(我正在插入,我有相应的过滤器)。

这里可以插入100万吗,还是需要等待所有select语句完成。

如果我开始插入,性能怎么样?

欢迎提问。

最佳答案

为此,您需要了解 SQL Server 中的锁定行为。 Sql Server 在访问数据库中的资源(行)进行任何操作时都会获取资源上的锁。

将获得什么类型的锁取决于您正在执行的操作类型以及您拥有的事务隔离级别。

默认情况下,您已读取已提交的事务隔离级别。并且您的读取(选择查询)将获得资源(行)的共享锁,这意味着也在读取行的其他用户可以访问这些行。

但是,如果另一个用户更新一行,sql server 将获得该行的排他锁,并且在提交更新语句之前该行将无法读取。

在具有默认读已提交事务隔离级别的表中插入行不会对其他用户正在读取的行产生任何影响,除非 sql server 在插入新行时必须锁定某些行以检查条件。同样,这取决于您插入行的方式。

我建议您在继续插入之前先阅读一些有关 sql server 事务隔离级别和 sql server 锁定行为的文章:)

特别研究可重复读事务隔离级别,它允许您插入数据,但可能会出现一些脏读。

关于sql - 同时在同一个表中插入和选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23293488/

相关文章:

mysql - 在不停机的情况下迁移巨大的生产数据库

php - 在表中插入一行并增加后面的自动增量值

sql - 数据库设计 - 重写值

java - 归并排序还是数据库?

python - SQLAlchemy 中的右外连接

sql - 如何在 SQL 数据库中搜索所有存储过程的文本

c# - SqlParameter(string, object) 无法处理常量值

c# - 针对 SQL Server 数据库的自定义身份验证

c++ - 使用 -O3 编译时将函数标记为内联?

macos - OS X 上的 Docker 和文件共享