dbwritetable 从多个 R studio 会话到同一个 SQL table 同时

dbwritetable from multiple R studio sessions to same SQL table concurrently

我从 RStudio 启动了 4 个会话,我在任务管理器上看到了 4 个 "R Studio R session"。我在每个会话中连接到相同的 SQL 数据库 table 和 dbwritetable 使用相同的 dsn 名称。

conn<-dbConnect(odbc::odbc(),"server",database="x_test")

dbWriteTable(conn,"x_testbl",export,overwrite=FALSE,append=TRUE)

请注意,export 是一个 data.table,它与正在写入的 SQL table 具有相同的列,并且每个 "export" table会话将相对独特,但某些列可能具有相同的值(自然)。

我希望在每个会话中并发执行多个写入。每个会话执行一些计算,然后 dbwritetable 将 data.table 写入 SQL table。这会导致任何问题吗?我能做些什么来确保没有问题吗?谢谢!

如果多个会话试图同时更新同一条记录,这可能会导致问题。其中一个会话可以锁定记录,因此另一个会话无法更新它。 您可以有一个会话来处理所有事务,而不是 4 个会话。

如果在同一个 SQL Server 2016 版本上测试了您的代码 使用 SQL Server Native Client 11.0(我没有安装你的驱动程序)并跟踪在服务器上执行的 SQL 代码。

我正在使用 iris 数据集:

dbWriteTable(con, "iris", iris, overwrite = FALSE, append = TRUE)

odbc 包基本上发出这些命令(准备好的语句):

declare @p1 int
set @p1=9
exec sp_prepare @p1 output,N'@P1 float,@P2 float,@P3 float,@P4 float,@P5 varchar(255)',N'INSERT INTO "iris" ("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species")
VALUES (@P1, @P2, @P3, @P4, @P5)',1
select @p1

exec sp_execute 9,5.0999999999999996,3.5,1.3999999999999999,0.20000000000000001,'setosa'
[... multiple inserts...]

exec sp_unprepare 9

因此,除了通常的 SQL 服务器,没有 运行 您的代码在多个会话中并行运行的风险,例如行的非确定性插入顺序(可能导致不同的 autoinc 值如果您尝试重现该行为,则插入相同的行)。

您还将有四个打开的连接(完全没有问题)。

如果您的目标是插入性能,可以使用 SQL 服务器的不同批量插入方法,但 dbWriteTable 的性能非常好(如果您使用最新版本)。

有关 "bulk-uploads" 通过 odbc 软件包的详细信息,请参阅:

https://github.com/r-dbi/odbc/issues/34

稍后添加:

each "export" table in the session will be relatively unique but some columns may have the same value (naturally).

如果你的目标 table 没有主键也没问题 插入重复的行(直到你想重新识别单个 行,但这纯粹是 SQL 问题)。您可以使用高-低模式向您的 data.table 添加一个 ID 行来解决此问题(高 = 每个会话的唯一值,低 = 来自 1:NROW(data) 的 R 序列,然后添加高值,例如“10000000”,这样整体 ID 在整个会话中都是唯一的 - 但当然会有间隙)。