浅谈用SQL实现工作流的并发控制
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
论文关键词:工作流 并发控制 SQL 数据约束 任务约束 论文摘要:工作流技术在信息系统的应用中,并发控制机制的设计是经常要面临的问题。给出一种基于将工作流中数据和任务分离的工作流并发控制机制,在保证工作流正确性的前提下,引入“数据约束”和“任务约束”的概念来提高工作流的工作性能和降低工作流设计的复杂性,并用数据库中sQL语言强有力的约束控制加以实现。 1引言 工作流是针对工作中具有固定程序的常规活动而提出的一个概念。通过将工作活动分解成定义良好的任务、角色、规则和过程来进行执行和监控,达到提高生产组织水平和工作效率的目的。一个工作流包括一组活动及它们的相互顺序关系,还包括过程及活动的启动和终止条件,以及对每个活动的描述川。工作流模型建立的目的是为了实现业务过程自动化和用计算机来执行,这就要求工作流模型不仅能够描述活动及其他们之间的相互连接关系,而且需要定义其他许多的信息,如组织、数据、资源等,同时对工作流模型的准确性有很高的要求。 目前的工作流业务系统对系统运行过程中出现的并发访问和异常错误的解决还存在一定的缺陷。工作流实例在运行过程中,有可能出现多个活动同时访问共享资源的情况,多个活动在数据操作上会相互重叠。为了保证系统能够正常运行,必须进行并发控制(ConcurreneyControl),防止出现“脏数据”,等现象。 在本文中,我们将主要讨论如何用SQL来实现工作流的并发控制,防止出现“脏数据”等现象。解决这个问题的核心是如何让这些独立的活动能够拥有自己独立的数据,而在某个活动需要访问共享资源而又正被其他活动所拥有时,让其等待。并发控制的实现必须有两个最基本的条件限制:①每个活动拥有共享资源的时间应该最短;②每个活动应该拥有尽可能少的共享资源[4l。同时,我们在寻找解决方法时还应考虑以下两个方面:①不能过多地增加工作流设计的难度;②尽可能地利用现有数据库系统所提供的服务功能来实现。 为了达到以上的要求,我们引入类似传统“锁”机制的“约束”机制来实现。这里的“约束”是一种临时的、强加在数据项(数据约束)或者任务状态信息(任务约束)上的一致性限制。数据约束主要控制数据项的修改,而任务约束主要控制任务中各个活动间的执行顺序,因而工作流中各活动间的相互关系可以通过控制对数据库的访问和限制各个活动的执行顺序来体现,而这两者的限制均能通过数据库管理系统(DBMs)中的SQL查询语言来实现。 2一个工作流实例 工作流根据所实现的业务过程可以分为管理型工作流(AdillinistrativeW rkflow)、设定型工作流(AdhoeWOrkflow)、协作型工作流(CollaborativeW6rkflow)和生产型工作流(ProduetionWbrkflow)!,,。在本文中,我们所讨论的工作流是基于生产型工作流,它应用在一个大规模、复杂和异构的环境下,包括一个周期重复的、可预测的复杂过程,同时,它还要接受和处理来自各个层次和各个方面的数据。下面我们简单介绍一下这一工作流的情况。 在图1中所示的工作流是基于一个供电系统内部的物资领料过程。当一份领料单到来时,这一工作流开始启动。领料开票人将领料单中信息输入电子表格同时产生一条新的纪录,接着两个并行任务将被执行:库存检查—检查库中物资种类和数量是否能够满足需要;计划审批验证—验证该张领料单是否经过相关部门审批。如果上述两个验证均能通过,则确认领料、产生销售清单、结账,最后从仓库中发料。其中每个任务都要涉及到对数据库的读和写操作。 3工作流分解—数据和任务的分离 在图1中所提到的领料工作流中,有两种典型的情况必须加以说明:①在物资管理系统中经常出现多个工作流同时启动,因而开票员将信息输入电子表格的同时必须为每条纪录提供一个唯一且没有冲突的领料编号,但是在这个任务没有结束前,开票员可能会取消操作或者出现其他异常情况,导致工作流没法正常结束。为了保证其领料编号的唯一且不冲突只能采用串行化操作;②假定一领料单己经执行库存检查和计划审批验证两个任务,而且己经完成结账,但是单子中的物资还没有从库中领走,而此时有另一单子也要求领与上一单子相同的物资,但是库中的物资数量只能满足一张单子的要求,如何解决他们两者之间的冲突,从而不至于违反数据库的一致性约束,又不得不要求工作流只能采用串行化操作。 如果不能有效地解决以上的问题,那这一工作流的系统性能将大打折扣,而且根本没法满足现代业务管理系统的要求。典型的解决方法有ATM(AdvancedTransaetionModel)方法、TransaetionalTaskInte脚tion、语义锁(SemantieLoeking)和冲突说明(ConflietSPeeifieation),但是工作流的形式过于多种多样,单一的一种解决方法没法满足具体的某一工作流的需要,因而我们在项目开发的实际过程中采用了一种基于将数据和任务分开的方法,类似于操作系统中进程主体与系统资源分开,而进程主体应获得其最小资源的思想。它综合考虑了以下3个因素:①工作流执行的正确性;②工作流的系统性能;③一工作流模型建立和管理的复杂度。 我们分析前面两种需要串行化操作才能完成的情况,整个过程基本上都是通过不停地访问数据库来实现的,其中最主要的就是对数据库的读写操作。我们把一组不可分割的数据库操作视为一个原子操作,同时我们把任务或活动主体完成这一操作需要访问的共享资源视为临界资源。多个任务访问和拥有这些资源必须满足“空闲占有,忙则等待”的原则。 为了将数据和任务分开,同时能保证数据库中数据的正确性、有效性和一致性,并且能满足数据库中自定义的各种完整性约束规则,我们引入了“数据约束”和“任务约束”。我们的思想是运用类似于典型的并发控制中的“锁”约束来实现数据库的完整性和一致性约束,但是它又不同于“锁”约束。我们引入的“数据约束”和“任务约束”是一个短时间的约束控制,他们随着工作流实例的启动而创建,随着工作流的结束而撤销。另一方面,“数据约束”随工作流或者任务实例的输入参数的不同而不同,不同的实例将建立不同的“数据约束”和“任务约束”。“数据约束”主要是为了保证正确的数据输入能够得到正确的数据输出,同时实现数据库中的各种静态约束、动态约束和自定义约束,而“任务约束”是为了保证工作流中各个任务能够按照他们之间的相互关系、前后顺序正确地执行。在上述工作流中,我们将实现某一活动执行的正确性和控制多个活动间的执行顺序作为两个目标来分开处理。譬如在库存检查中,“数据约束”是为了保证满足库中的物资数量不能低于最低数量的限制,而“任务约束”是为了保证领料单只有在执行完库存检查和计划审批验证后才能执行领料操作。 “数据约束”和“任务约束”都在工作流模型设计说明中指定。一个工作流实例通过设定约束和撤销约束来合理调度并发事务,避免并发事务之间的互相干扰造成数据的不一致性,从而提高系统的性能。 4并发控制的实现 4.1数据约束的实现 SQL查询语言作为数据库管理系统中的一个重要组成部分,它提供了极其强大的约束限制实现功能,其中包括关键值约束、域约束、实体完整性约束和参照完整性约束以及各种用户自定义的约束。数据库中的存储过程是经预编译和优化后的SQL语句和流程控制语句的集合。利用它以下的几个特点可以用来实现复杂的业务逻辑:①接受输入的参数后返回结果给调用的过程;②可以调用其他的过程;③可以返回一个状态字,指出调用的成果与失败;④比一般的SQL程序运行速度更快、更简单,使得存储过程更快、更可行。 触发器是一种特殊的存储过程,只要表格的数据改变,它会在任何时刻自动调用。其作用体现在以下3个方面:①触发器可以不允许违反参考完整性的操作,这样可取消企图修改数据的事务;②触发器可以执行比用CHECK定义复杂的约束;③触发器可发现数据改变前后的不同,然后基于这个不同进行动作。正是因为存储过程和触发器能够提供这么强大的功能,我们在实现“数据约束”和“任务约束”的过程中使用了比较多的存储过程和触发器。现在我们考虑解决图l中两张领料单领用相同物资的问题。 在图2中当领料单输入时开始整个任务过程,根据领料单中的信息建立相关的约束,保证下面活动能够进行串行化操作,接着检查种类和数量,确认能够满足需要时从仓库里发料,减掉相应的数量,最后撤销约束,允许其他任务继续执行。图2中设定领料约束的实现如下: CREAT JEPROCEDURESetReeeiveCheck @P一ReeeiveNumberChar(10), @P一MaterialNumberChar(10) AS Begin Deelare @P一Amountint Seleet@p一Amount=Count(*) FrornAetiveReee计e WhereMateria Numbe二@P一Materia1Number ff@P一Alnotlnt==0 Begin InsertIntoAetiveReeeive Values(@P一ReeeiveNumber,@P一MaterialNumber Efid Else Return(l) End 存储过程一开始,在表l中查找是否存在@P一MaterialNumber所对应的领料单编号,如果对应的某一领料单编号己经在表中存在,则存储过程返回1—表示该领料单中的这一物资已经被另一领料单锁定,此次锁定操作失败。如果表中还没有存在所对应的领料单编号,则向表中插入一纪录,表示该物资将被这一领料单锁定。一张领料单中可能存在多种物资,当所有物资均能被锁定时,整个领料约束完成,可以进入下一步。如果在设定过程中有一物资不能被锁定,则解除对所有领料物资的锁定,这一领料单必须等待。当然在整个并发控制过程中我们也同时引入了任务调度机制,从而保证每个任务都能顺利完成。
撤销约束的实现如下: CRE户L1,EPROCEDUREUnsetReeeiveCheek @P一ReeeiveNumberChar(lo) AS Begin DelCteFromAetiveReeeive WllereReceiv Number @P一ReceiveNumber End 设定约束和撤销约束保证了这一任务能够正确地执行,而检查种类和数量这一过程执行的时间很短,它的串行化操作对系统的性能影响不大,从而能提高整个工作流的性能。 4.2任务约束的实现 “任务约束”是为了保证整个工作流中各个任务的正确执行,它依照工作流中各个任务之间存在的任务关联来设定,而任务关联是根据工作流面向的相关物理模型来抽取的。 在图3中我们抽取了一个典型的工作流模型,它描述了各个任务之间的前趋关系。任务TZ、T3必须在任务Tl完成的前提下才能执行,而T4、TS只能在T3完成的前提下才能执行,最后任务T6在TZ、T4、TS全部完成的情况下才能启动。为了保证上述任务能够正确地按序执行,我们在每个任务启动前加上一定的约束条件,只有当这些条件满足时任务才能执行,而在条件未满足前必须等待。这些约束包括静态约束和动态约束。静态约束是在工作流设计阶段,设计者根据各个任务间存在的关联制定的,而动态约束则是工作流在运行时,根据任务内部数据间存在的逻辑性而动态设定和撤销。 在图4中我们抽取了计划单审批过程中的一个工作流模型,对于一计划单,由于它所属计划的类别和其他一些特殊因素,对不同的计划单可能会采取不同的审批流程,因而我们采取动态约束来实现对它的任务约束。不管静态约束还是动态约束,它们均能通过存储过程和触发器来实现。其具体的实现过程类似上节所述数据约束的实现。 5结束语 工作流的并发控制主要应该考虑3个方面的因素:①正确性:并发执行的任务之间不能互相干扰:②性能:并发执行的各个任务应占用最少的系统资源;③复杂性:工作流的建立和管理必须简单易行。我们正是从以上3个方面考虑,引入了“数据约束”和“任务约束”来提高工作流的性能和保证工作流的正确执行,同时利用数据库中SQL语言强有力的约束控制实现能力,使得我们的解决方法更加简单和高效。 参考文献: [1]范玉顺,等.工作流管理技术基础LM].北京:清华大学出版社,2001. [2]BernsteinPHadZilaeosGoodmanVConeurreneyControlandReeoinDatabaseSystems[M].Addison一slev,On-tario,Canada,1987. [3]JuhaPuustjarvi.WOrkflowConeurreneyContr01[J].TheComPuterJournal,2001,44(l). [4]AViSilbersehatPeterBaerGalvinGregGagne.OPeratingsystemConeePtSixthEditiontMI.Johnwil&Sons,2001. [5]BobakAR.DistributedandMulli一databaseSystems[M]J.teehHouse,199622. 该文章在 2011/3/3 16:37:32 编辑过 |
关键字查询
相关文章
正在查询... |