gpt4 book ai didi

c# - MySqlBulkLoader 与事务中的 MySqlCommand

转载 作者:行者123 更新时间:2023-11-28 23:29:53 30 4
gpt4 key购买 nike

我有一个 MySql 数据库,里面有九个表。我需要从 C# 中的异步作业动态上传到其中六个。但是为了加快上传速度,其中四个使用MySqlBulkLoader,另外两个使用手动上传的方式。为了支持并发并防止数据库中的错误,我需要同时上传它们。为此,我决定使用事务来确保“全有或全无”类型的上传。

问题就在这里:MySqlCommand 类允许通过其 Transaction 属性中的 MySqlTransaction 类支持事务,而 MySqlBulkLoader 允许原子上传(我使用 INNODB 作为引擎,参见 mysql - Can MySqlBulkLoader be used with a transaction? )。但是,MySqlBulkLoader 创建了它自己的原子上传事务,而另一个单独的事务将用于我将要执行的 MySqlCommand。这不支持序列化,并且如果一个批量加载程序完成其工作,但应用程序在另一个加载程序完成之前关闭,仍然可能导致错误。如果事务可以嵌套,这将是可以解决的;但是,他们不能:php - Mysql transactions within transactions .

我的问题如下:在 C# 连接器中是否有任何方法允许 MySqlBulkLoaderMySqlTransaction 关联,如果没有,是否有自动回滚以前的 MySqlBulkLoader 所做更改的方法。我查看了 Connector.NET 6.9 提供的 API,这似乎可以通过 MySqlConnection.BeginTransaction() 方法实现,但是来自 Werner Wolf 的问题否则建议。

编辑

我找到了 this question通过 Saravanan .但是,由于 MySqlBulkLoaderMySqlCommand 混合在一起,我认为该问题与此问题无关。

最佳答案

原题问:

is there any way in the C# connector to allow the MySqlBulkLoader to be associated with a MySqlTransaction
为此,似乎没有。仅仅将两个事务放在一起也不起作用,因为它不支持序列化(我认为它不会)。但是,另一个问题是:
if there is any way to automatically rollback changes made by previous MySqlBulkLoaders.
而且,似乎没有一种简单的方法来回滚更改。当然,我可以检查前后的表状态,删除之前不存在的条目;但是,这个解决方案并不是最优的。但是,解决方案可能会以问题的形式出现。原始问题的答案假设没有办法将单独的事务与 MySqlBulkLoader 相关联;但没有指定我们可以自己制作一个(也就是扩展 MySqlBulkLoader 类以包含 Transaction 实例参数)。这似乎是问题的解决方案,也是问题 Werner Wolf 的解决方案。问。

然而,这根本不是解决方案。由于 MySqlBulkLoader 是 SQL 的 LOAD DATA INFILE 语法的简单包装器,它的作用与 SQL 查询一样。来自MySQL Reference Manual ,我们收到了答案:

The statements listed in this section (and any synonyms for them) implicitly end any transaction active in the current session, as if you had done a COMMIT before executing the statement.
网页部分下方的语句是 LOAD DATA INFILE。这是对我们问题的真正答案:不可能将 MySqlBulkLoaderMySqlTransaction 相关联,至少不能按照我们预期的方式工作。然而,如上所述,解决问题的方法可能是检查每个表的主键索引,锁定表,保存它们的位置,并在上传失败后进行手动“回滚”。

关于c# - MySqlBulkLoader 与事务中的 MySqlCommand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37683217/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com