Database 在进程之间共享Postgres(或其他DBMS)事务上下文

Database 在进程之间共享Postgres(或其他DBMS)事务上下文,database,postgresql,architecture,transactions,Database,Postgresql,Architecture,Transactions,单片应用程序设计中的一种常见模式是将业务逻辑委托给专用服务,以Java中的javax.persistence.EntityTransaction实例或Go中的sql.transaction等形式传入开放事务 例如: //business.go 类型BusinessLogicService接口{ DoSomething(tx*sql.Transaction) } 类型businessLogicService结构{ } func(s*BusinessLogicService)DoSomething(

单片应用程序设计中的一种常见模式是将业务逻辑委托给专用服务,以Java中的
javax.persistence.EntityTransaction
实例或Go中的
sql.transaction
等形式传入开放事务

例如:

//business.go
类型BusinessLogicService接口{
DoSomething(tx*sql.Transaction)
}
类型businessLogicService结构{
}
func(s*BusinessLogicService)DoSomething(tx*sql.Transaction){
tx.ExecuteContext(…)
}
func NewBusinessLogicService(){
return&businessLogicService{}
}
//server.go
ctx:=context.Background()
tx,err:=db.BeginTx(ctx)
如果出错!=零{
log.Fatal(错误)
}
bls:=business.NewBusinessLogicService()
bls.剂量测定法(德克萨斯州)
tx.Commit()
在一个体系结构中,如果这些组件中的每一个都在不同的语言/运行时中实现,那么是否可以实现相同的效果?在这种应用程序中,Postgres负责对DB交易进行“记账”。在我看来,应该可以将事务的类似“句柄”传递给另一个进程,以读取其状态并附加操作

例如,等效业务逻辑作为gRPC服务提供,定义如下:

消息事务处理信息{
字符串事务_id=1;
}
消息DoSomethingRequest{
TransactionInfo交易信息=1;
}
消息DoSomethingResponse{
}
服务业务逻辑服务{
rpc DoSomething(DoSomethingRequest)返回(DoSomethingResponse)
}
服务器进程
BEGIN
s处理事务并传递对此BusinessLogicService的引用

ctx:=context.Background()
tx,err:=db.BeginTx(ctx)
如果出错!=零{
log.Fatal(错误)
}
连接,错误:=grpc.拨号(*服务器地址,选项…)
如果出错!=零{
...
}
延迟连接关闭()
bls:=pb.NewBusinessLogicClient()
///以某种方式将TX对象传递给远程服务
txObj:=&pb.TransactionInfo{…?}
结果:=bls.剂量测定法(txObj)
tx.Commit()

这在Postgres或其他数据库管理系统中可能吗?

是的,在Postgres和几乎所有其他rdbms中都可以做到。然而,具体细节因特定的数据库和调用语言而异,无论是Java、Go、Python,还是(gasp)Fortran(是的,这是可以做到的)。但是请记住,数据库是高度数据类型特定的,并且将您的接口语言与数据库相匹配仍然是您的责任,而不是目标数据库。@Belayer抱歉,我不清楚。我的意思是,它们是用不同的运行时/语言实现的,可能通过一些RPC协议(如gRPC)进行通信。我已经更新了这个问题,以澄清@curious101您为什么要这样做?您没有违反每个服务的数据库吗?