事务和原子操作
一、概述
原子操作是对一个单一的对象(包括类域、数组元素等永久对象)数据进行修改过程中发生断电、严重异常等失败情况时,保证原始数据的完整性,即恢复到初始数据状态。事务操作是对一系列的永久数据更新的一个逻辑的集合,要么所有的永久数据的修改都正确完成,要么所有的数据都被恢复为它们以前的值。
二、原子操作
原子操作定义了一个单一的对象、类域、数组元素等进行修改的过程中发生断电或异常等失败情况之后,如何处理永久数据的内容。如果在修改的过程中发生断电,当电源恢复时,该原子操作失败的永久对象数据会恢复到最初的值。
例如: 通过原子写array_buf数组元素。数组的原始数据为: array_buf = [6, 7, 8, 9]。外部通过原子准备将数组更新为:[1, 2, 3, 4]。当更新了两个数组原素: [1, 2]时发生断电,此时,原子操作要求下次上电后需恢复到最初值,即: array_buf = [6, 7, 8, 9]。 |
原子操作的API:
如:Util. arrayCopy(byte[] src, short srcOff, byte[] dest, short destOff, short length)。该方法保证要么所有的字节都被复制了,要么目标数组被恢复为它以前的值。
三、事务操作
事务操作是一个对一系列的永久数据更新的集合,即将修改多个不同对象的几个不同域或数组元素。事务操作保证要么所有的数据修改都正确的发生,要么所有的域或元素都被恢复到它们以前的值。
例如: 通过事务写array_buf1数组和array_buf2数组。 步骤一通过原子写array_buf1数组元素。数组的原始数据为: array_buf1 = [6, 7, 8, 9]。外部通过原子准备将数组更新为:[1, 2, 3, 4]。正确完成,即: array_buf1 = [6, 7, 8, 9]。 步骤二通过原子写array_buf2数组元素。数组的原始数据为: array_buf1 = [1, 1, 1, 1]。外部通过原子准备将数组更新为:[5, 5, 5, 5]。当更新了两个数组原素: [1, 2]时发生断电,此时,事务操作要求下次上电后需恢复事务中的所有数组数据恢复到最初值,即: array_buf1 = [6, 7, 8, 9], array_buf2 = [1, 1, 1, 1]。 |
事务操作的API:
通过调用JCSystem.beginTransaction()方法开始一系列的原子修改操作。从调用这个方法开始,每一个对象的原子修改都是假定的修改。域或者数组元素呈现的是已经被修改了(读这些域或数组元素将得到最后假定的值),但是这个修改还没有提交。
当调用JCSystem.commitTransaction()方法时,所有的假定修改都被提交到永久存储区,即一个事务操作正确完成。如果在JCSystem.commitTransaction()完成之前发生掉电或其它的系统异常,所有假定修改的域或素组元素将被恢复到它以前的值。如果决定取消这个事务,可以通过调用JCSystem.abortTransation()方法在程序上撤消那些假定的修改。
END