Page 293 - 《软件学报》2020年第9期
P. 293
2914 Journal of Software 软件学报 Vol.31, No.9, September 2020
照隔离方法,在多个事务均对一个数据进行写操作时,一个事务需等待之前所有的事务写操作均完成之后方可
开始执行,这将导致系统性能大幅下降.因而作者提出:在事务执行阶段不考虑事务所处的区块,而是直接对事
务进行排序.与此同时,对数据的写操作会产生多个副本.当事务完成时,按照事务在区块链中的顺序确认所产
生的多个副本中的一个为合法的副本.
(2) 先执行后排序的并发控制方式.在该种方式下,同样利用快照隔离来进行事务的并发处理.但是该方式
需要处理 3 个问题:首先,先执行再排序要避免幻读的可能,即读入还未写入的数据;其次,要避免脏读的可能,即
读入已被更新的数据;最后,网络中不同的节点由于延迟等原因,数据可能未达成一致,进而可能使得事务所需
访问的数据不存在.为了处理这些问题,作者提出了基于区块高度的快照隔离.具体而言,每一个数据库节点都
按照区块链的内容来存储数据.每一个节点记录相应的已写入的区块链的个数.区块链的个数可区分现有区块
链的快照.当一个节点 A 的区块的个数多于另一节点 B 时,则 A 节点的数据已更新,而 B 的数据还未更新.作者设
计了基于区块链高度的并发快照隔离方法,确保所有的节点均可在事务完成后,保证数据的一致性.
文献[68,69]提出了 BlockchainDB,一个将数据库与区块链相结合的系统,并设计了多种一致性水平,以提高
事务写的效率.在这种情况下,当用户提交查询时,数据库层的 TransactionManager 负责分发提交的查询并确保
不同的一致性.具体而言,BlockchainDB 有两种一致性水平可供选择.第 1 种为串行一致性.在串行一致性中,所
有的写操作按照提交的顺序插入队列中.当多个写操作同时对一个数据进行写操作时,只有队列中的第 1 个写
操作可以被执行.其他的写操作均处于等待状态,直到写操作完成.第 2 种为最终一致性.在最终一致性中,写操
作依然按照顺序插入到队列中,但是所有的读操作可以马上执行.在这种情况下,脏读的情况可能会发生,即数
据在被读入之后,被其他的写操作覆盖,因而之前所读的数据与存储的数据不一致.当用户提交查询时,由分片
管理器确认查询所需的数据处于区块链中的位置.之后,该位置的数据会被并行地读写.由于 BlockchainDB 支持
不同的一致性,查询的效率在不同的一致性下将会不同.例如,在串行一致性下,BlockchainDB 的查询可能需要
等待队列中写操作的完成之后才可进行.
4 区块链查询处理
在区块链中,所有数据均以链表的形式存储.与一般数据库的查询不同,区块链存储的数据包含在所有事务
当中.区块链查询分为一般查询与可信查询.表 3 从对关系型查询语句的支持、可信性查询以及链上链下数据
查询等多方面比较了最新的研究工作.
Table 3 Comparison of the query processing in blockchains
表 3 区块链查询处理比较
区块链 关系型语义 支持可信性查询 支持链上链下数据查询
Chainsql [86] 强 弱 ×
BigchainDB [87] 弱 弱 ×
SEBDB [88] 强 强 √
[1]
[2]
Bitcoin & Ethereum 弱 弱 ×
vCahin [84] 弱 强 √
4.1 一般查询处理
LineageChain [84] 研究区块链环境下数据溯源查询的效率问题,并支持需要数据溯源的智能合约.
LineageChain 针对每个数据,赋予其初始版本号.当一个事务对数据进行读写操作时,事务的输出可能是新
的数据或者更新现有数据的版本.这钟情况下,如果一个区块内还有不同事务时,则可以视作一个区块的事务对
前一区块数据库状态进行的修改.因此,数据版本号与区块同步递增.LineageChain 将这种递增关系建模成为一
个无环图.当需要溯源查询时,利用无环图中点的拓扑序进行搜索.
与文献[84]需额外构建图结构不同,文献[85]研究利用智能合约确定数据的关系,并对数据进行溯源查询.
当一个数据的创建者创建一个文档时,创建者可在区块链中部署一个智能合约.该合约的功能包括更改数据拥