这篇文章主要介绍一下事务处理的本质。
其实事务处理对我们来说并不陌生,但是很多人对事务处理的理解似乎有点弄不清,觉得事务处理只存在于数据库中。导致这样的结果是有原因的,当我们开始准备学习编程的时候,都是从某些编程语言开始学起,而不像人家的国外会先从概念、原理、模型开始学习,所以我们都会将某些技术与一些语言、平台联系在一起,导致我们学习其他的语言或者平台会很吃力。
在学校里也好还是自学也好,为了很快的上手都会去学习一些工具然后才会慢慢的去学习跟我们日常开发有关系的技术,仅仅是技术实现而不会去追根究底的问“为什么”。其实作为我们软件开发人员来说,为了跟好的发展需要有一个从概念、原理、技术实现这样的一个正确的学习方法或者说是一种梳理过程,只知其然而不知其所以然,这样会很困惑。
进入主题。我们就通过上面介绍的学习方法,先从概念到原理再到技术实现,将事务理清楚,它不仅仅是数据库中才会用到的,在计算机领域到处都会用到事务处理。[王清培版权所有,转载请给出署名]
事务的概述、特性、原理:
关于事务处理的概述网上到处都是,但是几乎每篇文章都会用数据库作为事务的案例进行讲解,而不会用某种编程语言或者将两者结合起来进行讲解。
所以对初学者来说认为事务就是数据库事务,我也尝试在网上搜了一下,80%都是数据库事务,什么BeginTran............。我想我这篇文章是有价值写的,希望通过本篇文章的讲解能让您对事务有个重新的认识,不要再将事务与数据库联系在一起,数据库只是实现了事务处理的一个管理工具。
概述:事务是一个逻辑区域,在这个逻辑区域里面的所以执行的代码都属于一个大的逻辑操作。也就是规定了,这是一个原子操作,要么都做要么都不做。保证了在任何一个环节出了问题都能恢复到最初调用前的状态。
特性:上面我们阐述了事务的概念,那么特性有哪些?事务是逻辑区域,将所有参与到事务处理的资源、功能纳入到统一的管理中心来,进行统一的协调管理共同完成一次重大的事务。特性是说明事务的一些原则、特征,比如:事务的状态、事务的隔离等,事务必须具备这些特征,只有具备这些特征才算是事务。[王清培版权所有,转载请给出署名]
原子性(Atomicity):事务的原子性,是指事务内部的所有操作均被视为一个整体,要么都执行成功,要么都不要执行。假如我们用事务来实现一个关于数据剪切的功能,首先我们要先剪切然后在粘贴,如果我们粘贴失败了,那么必须保证数据还要还原到最初的状态下,这虽然是两个动作,但是它在事务里面就是一个动作。
一致性(Consistency):一致性是保证事务在执行期间对数据的修改在最终不管是成功或者失败了都要使数据时正确的。就好比上面所说的,我们剪切数据,当粘贴的时候出现问题,就不能随随便便的终止了,在事务内部对数据的修改要保存这,如果是事务失败就要用最初的数据恢复,如果成功了就用修改的数据保证最后的结果。
隔离性(Isolation):隔离性比较好理解,多个事务对同一个资源的访问要相互隔离,井水不犯河水,你的修改不会受我的影响同时你的修改也不会干扰到我的执行。这样就保证了数据的完整性。当事务在执行期间访问的数据都是已经持久化后的数据,也就是一致性过后的数据,不会试图访问另一个事务内部的数据。
持久性(Durability):持久性是说事务一旦执行完毕,数据的修改将是永久性的。这个时候事务内部的中间状态已经不复存在,事务在执行期间占用的资源已经全部释放,所以这个时候无法将数据恢复到最初的状态,除非资源管理器有这方面的支持,也就是我们的数据库管理系统是可以通过日志进行恢复。(后面将会讲到资源管理器的原理)
推荐书籍:事务处理:概念与技术---计算机科学丛书
原理:
上面我们了解了事务的概念、特性,那么事务的实现原理是如何呢,在这里我穿插一句,我们这里只讨论事务的理论跟具体用哪种语言实现或者数据库是没有任何关系的,只有搞清楚了这些理论,才能全局的理解事务处理,我保证你会对数据库的事务处理有个崭新的认识。
那么如何才能使事务运作起来呢,也就是事务的实现模型。任何语言任何工具对事务的实现都会依照原理来进行编码,所以我们暂时抛开那些乱七八糟的数据库事务。来了解事务的实现原理,它由哪几大块组成,彼此是如何协调完成事务的。
事务管理器:事务的开始直到结束在这周期中都需要有一个中心进行管理事务范围内的所以参与者,在事务内部可能包含多个操作点,那么如果管理呢。我们来看一下图解。
图2:
首先事务的发起者会初始化全局事务环境,只不过这个环境里面只有发起者一个对象存在,然后随着调用的不断延伸使事务的环境不断辐射,事务的环境可大可小这要看事务的应用范围了,普通的数据库事务就很简单,事务的范围不会超过数据库引擎,但是现在大型的联机事务处理就设计到多数据库引擎之间的事务处理。
那么调用者如何参与到事务中去呢,我想这就跟具体的语言平台有关系了,不同的语言不同的平台实现可能不同。后面我们就用.NET事务来讲解,在.NET里面事务是如何使用的。[王清培版权所有,转载请给出署名]
上图只是说了一下事务是如何扩散事务环境的,那么在事务的生命周期中到底有哪些东西参与了,这就涉及到了事务处理的实现核心,这些模型支撑了事务的整个生命周期。
图3:
我们按照上图的讲解来分析一下事务是如何实现的,用不同的语言不同的平台均可以实现,关键是我们要能理解实现的原理。
事务的发起者(客户):这里也是事务的开始,环境由它创建,环境的传播是通过事务环境感应自动扩展,但是有些地方也需要手动的进行事务环境的传播和分离。
资源管理器:资源管理器是负责事务要操作的数据,资源管理器要配合事务的执行保证数据在适当的时候能顺利的持久化。资源管理器就是我们日常使用的数据库管理系统,只不过数据库管理系统已经很强大了,能完成复杂的数据处理,包括对分布式事务的支持、DTC的支持等等。所以我们这里要明白数据库事务处理是在数据库管理系统范围内的事务处理,我们也可以自己编写具有事务性的软件工具。
具体事务管理器是如何参与到事务环境中去的,就要看具体的平台了。下面文章我们再来了解在.NET里面是如何实现事务处理、分布式无处理、数据库事务处理的。
事务管理器:这是事务环境的总轴,负责事务环境内的一切管理,包括对资源管理器的登记通知等等。
[王清培版权所有,转载请给出署名]