如果应用程序被破坏,就像使用以下层/层
一样应用层,业务层,数据层(通过WCF暴露给业务,与App / Bussiness和Data物理分离)和Data。 如何完成在业务层中开始但在数据层上运行的事务?
数据层:
[DataContract]
public class Customer
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
}
[DataContract]
public class Order
{
[DataMember]
public int Id { get; set; }
[DataMember]
public int CustomerId { get; set; }
}
/*
CRUD classes on both entities (I'm hoping this implementation does not matter on the data tier, as the transactions I hope to start on the business end and could potentially have different implementations on the data tier across different areas)
*/
商务:
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Order
{
public int Id { get; set; }
public Customer PurchasedBy { get; set; }
}
public class PlaceOrderService
{
public void Execute(Order order)
{
try
{
// Begin Transaction
// Call to data tier to create/get customer depending on if they are new or existing
// Call to data tier to create order
// Commit transaction
}
catch (Exception)
{
// Rollback transactions
}
}
}
答案 0 :(得分:0)
您需要通过服务设计和管理自己的逻辑交易。
通常这意味着以下流程:
我已经看到这在基于消息传递的系统中实现,并且它工作得相对较好,但确实需要一些开销才能正确管理逻辑事务。
答案 1 :(得分:0)
如果数据层在物理上是分开的并且不代表业务交易设施,那么您必须推出自己的补偿资源管理器。如果数据层位于业务facsade上,那么您可以创建SQL事务并将其传递到每个数据层调用,以便它们可以加入事务。
在许多情况下,我们可以使用的唯一交易功能是SQL Server数据库引擎事务。在多数据库环境中,利用队列和其他非关系数据库,即使这样也不可用。在这种情况下,您需要为各种数据存储体系结构中的每个事务组件(即,如果您打算使用INSERT)进行数据反转操作,并使用它们来撤销失败的事务。