通过物理分离实现“业务”事务多层体系结构

时间:2014-08-26 12:41:04

标签: c# wcf transactions n-tier-architecture

如果应用程序被破坏,就像使用以下层/层

一样

应用层,业务层,数据层(通过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
        }
    }

}

2 个答案:

答案 0 :(得分:0)

您需要通过服务设计和管理自己的逻辑交易。

通常这意味着以下流程:

  1. 请求从交易服务
  2. 开始逻辑交易
  3. 接收您的交易的逻辑交易ID
  4. 流程中的所有消息/调用都将包含事务ID 对于未提交的数据,可能意味着物理数据库中的隔离区域 交易仍在进行中。
  5. 完成相关调用并验证数据后,请求提交逻辑事务或根据验证/验证结果请求回滚。
  6. 我已经看到这在基于消息传递的系统中实现,并且它工作得相对较好,但确实需要一些开销才能正确管理逻辑事务。

答案 1 :(得分:0)

如果数据层在物理上是分开的并且不代表业务交易设施,那么您必须推出自己的补偿资源管理器。如果数据层位于业务facsade上,那么您可以创建SQL事务并将其传递到每个数据层调用,以便它们可以加入事务。

在许多情况下,我们可以使用的唯一交易功能是SQL Server数据库引擎事务。在多数据库环境中,利用队列和其他非关系数据库,即使这样也不可用。在这种情况下,您需要为各种数据存储体系结构中的每个事务组件(即,如果您打算使用INSERT)进行数据反转操作,并使用它们来撤销失败的事务。