zoukankan      html  css  js  c++  java
  • [AX]AX2012开发新特性UnitOfWork

    类UnitOfWork用来管理数据库事务,它成功处理所有保存在表变量的纪录,或者拒绝所有的更新,这个类还可以自动管理外键关联表的删除、插入和更新顺序,自动将主表主键值填入相应的外键列。UnitOfWork不能象delete_from那样处理where选择的批纪录,只能操作给定的行。典型的用法:

    server static public void tryUnitOfWork()
    {
        Table1 table1;
        Table2 table2;
        UnitofWork  uow=new UnitofWork();
        ;
        delete_from table1;
        delete_from table2;
        table1.ID="xx1";
        table1.ValidFrom=today();
        table1.ValidTo=today()+10;
        table2.Field1="table2field1";
        table2.masterTable1(table1);
    
        uow.insertonSaveChanges(table1);
        uow.insertonSaveChanges(table2);
        uow.saveChanges();
    }

    首先这个UnitOfWork必须是在服务器上运行,所以这里方法被定义为static并加上server关键字,因此这个方法不能使用Job,这里是一个类的静态方法。

    表table2的Table1Fk字段用于容纳table1的recid,这是在table2的relations新建一个foreign key的关系时自动创建的,注意表table2的masterTable1方法,这也是设置foreign key的关系时自动创建的,方法名来自于relation的属性RelatedTableRole,同时必须把relation的CreateNavigationPropertyMethods设置为Yes。

    UnitOfWork要求使用乐观(optimistic)并发控制,如果任何表变量使用了pessimistic并发控制,saveChanges会抛出错误。所有表都有一个OccEnabled属性,默认为yes,表示启用Optimistic并发控制,可以使用concurrencyModel 方法使用oncurrencyModel::Optimistic临时设置为乐观并发控制。新插入的纪录在select时也要使用optimisticLock 关键字,以防纪录死锁。

    UnitOfWork内部使用数据库事务来处理数据更新,如果任何一个更改被拒绝,所有的更新被回滚保持数据以前的状态,同时表变量也被回滚,如果表变量使用insertonSaveChanges更新表变量会被重新初始化为null,如果用的updateOnSaveChanges表变量保持以前的值。

    使用UnitOfWork的一个原则是尽量保持事务小规模,比如多次调用saveChanges提交更改,而不是在很多很多的insertonSaveChanges之后才saveChanges,因为大事务需要锁定更多的资源,容易造成死锁,当然也不是说每次insertonSaveChanges之后就调用saveChanges,这又会影响到性能的。

    另外UnitOfWork也是首纪录级权限RLS控制的,UnitOfWork不能用于操作临时表。

    更多信息查阅http://msdn.microsoft.com/en-us/library/gg846338.aspx

  • 相关阅读:
    (转载)关于一些对location认识的误区
    Python内置数据结构--列表
    Maven
    Python基础语法
    安装ipython和jupyter
    Python环境安装
    Java多线程
    SpringMVC集成springfox-swagger2自动生成接口文档
    SpringMVC拦截器
    SpringMVC异常处理器
  • 原文地址:https://www.cnblogs.com/duanshuiliu/p/2637410.html
Copyright © 2011-2022 走看看