我的 Postgres 数据库中有一些主表(如 Companies)和许多从属表(如 CompanyAddresses、CompanyPaymentInfos 等):
CREATE TABLE Companies (
Id uuid NOT NULL PRIMARY KEY,
...);
CREATE TABLE CompanyAddresses(
CompanyId uuid NOT NULL PRIMARY KEY REFERENCES Companies(Id),
...);
CREATE TABLE CompanyPaymentInfos(
CompanyId uuid NOT NULL PRIMARY KEY REFERENCES Companies(Id),
...);
我在 C# 代码中使用标准库中的事务:
private TransactionScope GeTransactionScope()
{
return new TransactionScope(
TransactionScopeOption.RequiresNew,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadCommitted
},
TransactionScopeAsyncFlowOption.Enabled);
}
private async Task DoChange(...)
{
using (var scope = GeTransactionScope())
{
await Insert(Company);
await Task.WhenAll(
Insert(CompanyPaymentInfo),
Insert(CompanyAddress),
Insert(CompanyTags),
// so on
);
scope.Complete();
}
}
Each Insert
命令仅生成 SQL 代码的执行without任何内部交易。
在执行 DoChange 后,我收到此错误:
Npgsql.PostgresException (0x80004005): 23503: 插入或更新
表“companyaddresses”违反外键约束
“companyaddresses_companyid_fkey”
当然,我还有很多问题,比如:
- 为什么我会收到错误消息?
- 为什么我在插入 CompanyAddress 时收到错误,而不是 CompanyPaymentInfo ?
如果我改变DoChange
顺序执行一切正常:
private void DoChange()
{
using (var scope = GeTransactionScope())
{
await Insert(Company);
await Insert(CompanyPaymentInfo);
await Insert(CompanyAddress);
await Insert(CompanyTags);
// ...
scope.Complete();
}
}
也许有帮助:
- 我用的是.Net Core 2.0
- 我使用具有标准设置的 Postgres 10.4(ReadCommited 作为隔离级别等)。另外,我还添加了
enlist=true
到我的连接字符串以使交易正常进行。
- 我在我的内部使用 Npgsql 3.2.5 和 Dapper 1.50.2
Insert
command