OpenDaylight开发者指引之Controller篇(二)


提交事务

通过下面方法可以提交事务并得到处理:
CheckedFuture<Void,TransactionCommitFailedException> submit();


在事务中应用程序通过调用submit(),提交自己所修改的内容。封装事务(防止下次写操作再次使用本事务)并提交处理,并将它应用到全局概念数据树种。方法submit()是不是阻塞的,一旦事务处理完成并且修改已经应用数据树,这表示操作成功并且返回ListenableFuture。如果提交的数据失败,则返回TransactionFailedException。

应用程序通过ListenableFuture可以异步监听事务提交状态。

MD-SAL-translate-picture-1.png

  1. 通过写事务writeTx的submit方法进行提交并且注册回调函数FutureCallback。
  2. 当写事务writeTx成功提交到数据树中,函数onSuccess函数将被调用。
  3. 当写事务writeTx执行失败,函数onFailure将被调用。异常提供了额外的细节和失败的原因。


如果应用程序需要阻塞直到提交成功,我们可以用checkedGet()方法进行等待,直到提交完成。

MD-SAL-translate-picture-2.png

  1. 调用writeTx的submit方法进行提交并且阻塞直到writeTx事务完成。如提交失败,TransactionCommitFailedException异常将被抛出。
  2. catch分支将会捕获TransactionCommitFailedException异常,并记录日志。


本地事务状态

读写事务维护着本地事务状态,保持所有修改信息,但这只是针对本地事务。
如果之前的事务已经修改那么可以从事务返回的数据进行读取。

假设路径PATH的初始化状态是A

MD-SAL-translate-picture-3.png

  1. 通过方法ReadWriteTransaction创建一个读写事务rwTx
  2. 通过rwTx读取路径PATH,返回值是A
  3. 通过rwTx将B写入PATH
  4. 读取路径PATH返回值是B,因为在第
  5. 通过rwTx将C写入PATH
  6. 读取路径PATH返回值是C,因为在第


事务隔离

正在运行的(未提交)的事务间是相互隔离的并且在一个事务中的修改,对于其他正在运行的事务是不可见的。

假设路径PATH的初始化状态是A

MD-SAL-translate-picture-4.png

  1. 在包含路径PATH,值为A的数据树中,创建一个只读事务。
  2. 在包含路径PATH,值为A的数据树中,创建一个读写事务。
  3. 只读事务对路径PATH进行读取,返回值是A。
  4. 通过读写事务对数据树进行更新,将PATH修改为B。这个修改没有公开,只是在本地事务中。
  5. 通过读写事务进行读取操作,返回值是B。
  6. 通过读写事务提交修改到数据树中。一旦提交完成。PATH将被修改为B并被公开。对于这次修改,之前已经创建的事务不受影响。
  7. 由于提供稳定、隔离的视图,因此之前创建的只读事务对路径PATH进行读取操作,返回值仍然是A。
  8. 在基于当前数据树,再次分配一个新的只读事务。
  9. 因为读写事务已经提交修改,所以新的只读事务读取的返回值是B。


注意:

示例中包含的阻塞调用,仅仅是为了说明动作可以发生在其他异步动作之后。对于大部分用例来说,使用阻塞调用ListenableFuture#get()是非常晦涩的,我们应该使用异步函数Futures#addCallback(ListenableFuture, FutureCallback),对结果进行异步监听。

0 个评论

要回复文章请先登录注册