并发插入数据库

时间:2015-09-14 12:00:58

标签: c# sql-server

我正在构建一个程序,该程序从六个不同的来源获取推送数据并将数据插入数据库。每个源都有自己的功能,一旦它们到来就执行插入,但所有源都写入同一个表。

我会有以下问题:

  • 如果一个源当前正在写入该表并且另一个源同时开始写入,那么插入是否有可能相互阻塞?

  • 该表也经常用于通过连接更多表来显示数据的视图来读取数据,这会造成任何问题吗?

  • 目前每个来源都有自己的数据库连接来写入数据,最好是只有一个连接,还是每个都有自己的连接?

3 个答案:

答案 0 :(得分:2)

  

如果一个源当前正在写入该表和另一个源   开始写同时插入是否有机会   相互阻挡?

这取决于索引。如果索引键具有相同或连续的值,您可能会在事务持续时间内看到short = term blocking。

  

该表也经常用于通过视图读取数据   加入一些表来显示数据,这可以构成任何   问题

这取决于隔离级别。如果出现以下情况,则不会发生阻止:

  • SELECT个查询正在READ_COMMITTED隔离级别运行 READ_COMMITTED_SNAPSHSOT数据库选项已打开

  • SELECT查询未触及未提交的数据

  • SELECT查询在READ_UNCOMMITTED隔离级别中运行

即使阻塞确实发生,如果INSERT交易很短,也可能是短暂的。

  

目前,每个源都有自己的DB连接来写入数据   最好只有一个连接,或者各自使用自己的连接?

取决于您要解决的问题。单个连接将确保插入不会相互阻塞/死锁,但无论如何都可能不是问题。

答案 1 :(得分:1)

请找到以下内联答案

如果一个源当前正在写入该表并且另一个源同时开始写入,那么插入是否有可能相互阻塞?

  

在这种情况下,另一个资源将等待它。(插入将处于下一个的等待状态)

该表也经常用于通过连接更多表来显示数据的视图来读取数据,这会造成任何问题吗?

  

没问题。

目前每个源都有自己的数据库连接来写入数据,最好是只有一个连接,还是每个都有自己的连接?

  

最好有一个数据库连接。

答案 2 :(得分:0)

  1. 阻止“彼此”,即无法进行死锁。
  2. 没问题。仅当select太慢时,才会延迟下一次插入。
  3. 不同的连接没问题。