<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <contrib-group>
        <aff id="aff0">
          <label>0</label>
          <institution>Proceedings of the Spring Researcher's Colloquium on Database and Information Systems</institution>
          ,
          <addr-line>Moscow, Russia, 2011</addr-line>
        </aff>
      </contrib-group>
      <abstract>
        <p>Snapshot Isolation (SI) level is extensively used in commercial database systems. We developed a simple SI implementation protocol for distributed DBMS and implemented it in the Apache HBase. The work presents the performance evaluation of the protocol. We have measured the performance of a single-node system and modeled the performance of a distributed HBase cluster.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>In the last ten years the special class of data-intensive
web-application has emerged. Youtube, Google Maps,
social networks, etc. represent the applications of the
class. This applications can be characterized by the
following features: they work with large volumes of data
and typically do not need ACID transactions.</p>
      <p>The choice of the concurrency control to employ in
the application is of great importance, since it affects the
performance of the application as well as the complexity
and cost of development. For example, choice of
eventual consistency (EC) as an isolation level may result in
increased complexity of programming model. Thus,
application designer has to carefully look for the most
suitable compromise between level of guarantees he gets and
performance of isolation level protocols.</p>
      <p>
        The Snapshot Isolation (SI) isolation level was
introduced in [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. It is widely adopted by the commercial and
open-source systems thanks to its ability to cope with
read intensive workloads and high degree of consistency
guarantees. It is even used instead of serializable
isolation level in Oracle and PostgreSQL. This decision can
be justified by level of guarantees SI actually offers.
      </p>
      <p>The transaction executed under SI reads data from a
snapshot of the data as of the time the transaction started.
Two transactions are called competitive if they have
overlapping execution intervals and they have written the
same data item. When the transaction is ready to commit,
it is assigned the commit timestamp and in case if there
is no competing transactions in the system it commits.
This feature is called “First-Commiter-Wins”.</p>
      <p>
        We developed SI protocol for distributed DBMS. We
have presented it in [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] along with its implementation
prototype. We have chosen HBase to implement it in
because it is open source distributed data storage which
has natively supported only EC1. In [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] we have
measured the performance of the prototype in a single-node
mode and compared it with that of HBase, but we had not
an opportunity to run the system in a distributed mode.
Compared to [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], in this work we present performance
model of the protocol and the comparison of the protocol
simulation results with HBase simulation results for the
distributed mode.
      </p>
      <p>The remainder of this paper is organized as follows.
In Section 2 we discuss literature works on the DBMS
performance evaluation with concurrency control
performance comparison being in focus. Section 3 contains
the description of the protocol and its implementation.
Performance model is provided in Section 4. Section
5 presents results of conducted simulation experiments.
Section 6 contains discussion of protocol
implementation performance along with model validation issues. In
section 7 the results are summed up.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Related Work</title>
      <p>A lot of concurrency control algorithms was introduced
in the last 30 years. Considerable research was devoted
to evaluating the performance of concurrency control
algorithm in the 80s and the earlier 90s.</p>
      <p>
        In [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] authors has examined the assumption set
employed in concurrency control performance (CC)
modelling. Authors has investigated the reasons of
apparent contradictions in performance results of earlier
studies. In particular, the common assumption of infinite
resources was critically examined. The paper [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] lists the
CC methods along with results gained from analytical
and simulation studies. For a given CC method the
models employed for its performance evaluation are briefly
described. In [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] issues in modelling performance are
discussed. The paper contains tens of questions to be
solved by the researcher before he starts to implement
his model along with some critique of using one’s
intuition in performance modelling.
      </p>
      <p>
        Works [
        <xref ref-type="bibr" rid="ref5 ref6 ref7">7, 6, 5</xref>
        ] are focused on the distributed
systems performance evaluation, however, this studies do
not have the CC methods in the main focus. In [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]
performance models classification based on the model
assumption set is provided. The paper [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] contains a detailed
comparison of Shared Disk and Shared Nothing (SN)
architectures. In particular, the performance of Scan and
Join operators is discussed. The paper [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] contains a
comprehensive SN DBMS performance study,
perfor1Optimistic concurrency control was the only available alternative
for HBase by the moment we started implementation.
mance is modeled using three different workloads, one
of them being generated from database traces.
      </p>
      <p>
        The work [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] presents an analytical SI performance
model for a standalone server machine.
      </p>
      <p>
        Recently there was a number of studies related to SI
implementation in distributed systems [
        <xref ref-type="bibr" rid="ref13 ref14 ref4">14, 4, 13</xref>
        ]. The
work [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] presents a technique to preserve the behaviour
of centralized SI system in guaranteeing global SI in
distributed, lazily replicated system. The technique
leverages local SI concurrency control. A simulation model
was developed to study the cost of using the technique.
This model is rather simple in aspects of single-node
performance, e.g. the service time per operation is specified
as model parameter.
      </p>
      <p>
        The article [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] presents a cloud storage system
named ecStore. The article contains a brief description of
concurrency control protocols used, but it does not
contain CC performance comparison.
      </p>
      <p>
        In the paper [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] an approach to use HBase as a cloud
database solution with global SI is described. The paper
presents an optimistic protocol, which uses 4 special
tables and several queries to provide SI gaurentees. The
protocol is implemented on top of bare-bones HBase on
the client side, it’s imlementation is rather high-level, it
does not introduce any changes to server code. Authors
have conducted several experiments in a distributed
environment (3-machine cluster) to evaluate the cost of
employing the proposed protocol.
      </p>
      <p>In this work we present performance models for our
protocol and HBase and the comparison of simulation
results. To the best of our knowledge the performance
model of Key Value store like HBase has not been
presented yet.
3
3.1</p>
    </sec>
    <sec id="sec-3">
      <title>Implementation Protocol</title>
      <sec id="sec-3-1">
        <title>Protocol Description</title>
        <p>Let us suppose that current transaction state, its start
timestamp and end timestamp (if a transaction has been
already committed or aborted) are available at the
execution time.</p>
        <p>Read operation execution is straightforward. To read
a data object x the transaction t performs a selection of
all versions of x, committed before start time of t. Then
it traverses the obtained list of versions to find the latest
committed version. If the list contains version written by
t, this version is read instead of the latest committed.</p>
        <p>Before the value of x can be updated the transaction
has to ensure, that no competitive transaction had already
written x. If x was updated by transaction, which was
committed after t had started or by active transaction,
than t aborts.</p>
        <p>
          We have formally proved the correctness of the
protocol in [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ], but the prove is not in the scope of this work.
3.2
        </p>
      </sec>
      <sec id="sec-3-2">
        <title>Data Storage Design Issues</title>
        <p>
          We have implemented our protocol in HBase. HBase is
an open-source distributed data storage written in Java. It
was made after Google Bigtable. In [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ] Bigtable is
presented along with design and implementation decisions
made by developers.
        </p>
        <p>Authors has called Bigtable “a sparse distributed
persistent multidimensional sorted map”. Bigtable API is
very simple. HBase API is also restricted to get, put,
delete and scan operations. The data processing
necessary for a query can not be pushed as close as possible
to data, as it is usually done in distributed RDBMS. If a
client wants to update data according to a special rule, it
requests the data, updates it locally and puts the updated
data to the storage. That is, complex query execution
is decomposed into two or more phases. As it was said
before, initially only eventual consistency isolation
guarantees were provided by HBase. HBase/Bigtable users
who needed transactional execution, were suggested to
implement it themselves using data timestamps.</p>
        <p>HBase cluster consists of servers of two types: master
nodes and region nodes. Every region server manages a
number of regions. HBase uses horizontal partitioning,
each region contains data for an interval of keys.</p>
        <p>HBase is column oriented storage, that is, data is
stored on a per column basis in main memory and in the
file system. Every column store has its own set of files
and a per file buffer pool employing the classical LRU
discipline to manage pages. HBase use immutable files
to store data. When the total space occupied by updates
kept in main memory exceeds specified threshold a new
file is written to the file system. This is done in a special
thread. HBase uses write ahead log (WAL), that is, every
update is written to log before it gets to main memory
store.
3.3</p>
      </sec>
      <sec id="sec-3-3">
        <title>Protocol Performance Discussion</title>
        <p>The “First-Commiter-Wins” feature has an optimistic
nature, thus SI definition naturally accepts the optimistic
protocol. Our approach is not optimistic, it should be
rather called “First-Updater-Wins”.</p>
        <p>
          Although the algorithm is nonlocking, it is more close
to restart oriented locking methods such as
immediaterestart. Immediate-restart algorithm description, its
performance modelling and comparison with blocking and
optimistic methods can be found in [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]. More
sophisticated restart oriented methods exist such as
woundwait or wait-die, which could outperform the
immediaterestart method in most cases ([
          <xref ref-type="bibr" rid="ref11">11</xref>
          ]). We did not attempt
to build a protocol on top of this ideas.
        </p>
        <p>Before a data object is written the version check is
performed. All data object versions made after the
transaction had started must be selected and traversed. It may
take a considerable amount of time, because some of
committed versions of data object may have been already
written to the file system. In this case a number of page
reads is to be performed.</p>
        <p>Some tricks could be used to avoid unnecessary disk
accesses or at least reduce their probability. The main
memory store could be assigned a timestamp each time
its contents are flushed to a new file. The version check
performed in main memory is sufficient to ensure
“FirstWriter-Wins” feature if the transaction started after the
main memory store had been written to disk last time.
The second trick which may be used is to write only
the oldest versions to file, keeping new ones in memory.
Given average transaction execution time tavg, we can
keep versions with timestamps greater than now() tavg.</p>
        <p>To ensure transactional execution of queries in
distributed data storage we used the distributed commit
protocol. We have chosen a protocol similar to Two Phase
Commit (2PC) for its implementation simplicity. The
classical 2PC successfully commit scenario consists of
the following steps. The transaction initiator waits for
READY message from all the participated servers. When
all the participants voted to commit, it sends them
COMMIT message and waits for ACK messages. After all
ACK messages were received, initiator finishes the
transaction.</p>
        <p>Since HBase uses WAL, when subtransaction sends
READY message to the transaction home node (client
machine), it has no additional work to do before it can
commit. It can not be aborted by other local
subtransaction. When the transaction initiator receives READY
message from all the execution region servers, it just
sends them COMMIT message and commits the
transaction locally. It does not wait for ACK messages from
executor servers as in the classical 2PC.</p>
        <p>Let us summarize the overheads introduced by the
protocol.</p>
        <p>Employing distributed commit protocol leads to
additional communication overhead.</p>
        <p>Version check may lead to additional (local) disk
accesses and may consume CPU.</p>
        <p>Certain resources are wasted due to additional
aborts by protocol reasons.
4</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Simulation Performance Model</title>
      <p>
        The simulation model was written in Java using Simkit
simulation package [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ].
      </p>
      <p>Our model is rather hardware resource bounded than
data contention bounded. We believe that HBase was
not intended to be used for the workloads with high data
contention. Our model was not aided to solve some
fundamental questions, it concentrates on answering the
engineering questions only. We have modeled the
particular distributed data storage performance, so the model is
much less universal than models employed in mentioned
related works. However, the model is rather simple. It
abstracts from some details. For example, the primary
copy replication used in HBase, may affect the
performance, but it is not reflected in the model.</p>
      <p>The model will be described in terms of queries, we
will use the term transaction when we need to outline the
differences.
4.1</p>
      <sec id="sec-4-1">
        <title>Modelling Assumptions</title>
        <p>We use a close system model. There is always the same
number of queries in the system. After one query had
completed its execution, the new one immediately
replaces it. Since the concurrency control performance
hardly depends on the active query count in the system,
we decided to keep these number constant.</p>
        <p>The cluster is modelled as a queueing network, each
node is itself modeled as a queueing network.</p>
        <p>
          We use quite common assumption called
“homogeneity assumption” in [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ].
        </p>
        <p>All database sites have the same structure and the
same service capacity.</p>
        <p>The amounts of data allocated to each unit are equal.</p>
        <sec id="sec-4-1-1">
          <title>Parameters CPU: #avg instr.:</title>
        </sec>
        <sec id="sec-4-1-2">
          <title>Disks:</title>
        </sec>
        <sec id="sec-4-1-3">
          <title>Network:</title>
        </sec>
        <sec id="sec-4-1-4">
          <title>Database:</title>
          <p>cores per PE
processor capacity (MIPS)
BOE and EOE steps
per object reference
for message
for IO operation
count per PE
access time mean (ms)
page transmission time (ms)
throughput (Mbit/sec)
min packet size
page size (Kb)
count of pages per PE
count of pages in buffer pool</p>
          <p>Data accesses are spread among nodes in uniform
manner.</p>
          <p>We do not use a sophisticated model of a
communication network as well, because we believe that network
should not be a bottleneck. In our model there is a
virtual connection between every query initiator (client) and
executor node with 100Mbit/sec throughput.</p>
          <p>Table 1 contains the system settings used for
experiments.
4.2</p>
        </sec>
      </sec>
      <sec id="sec-4-2">
        <title>Workload Model</title>
        <p>The workload model is homogeneous, i.e. it consists of
queries of one type. As was mentioned above, the
complex query is executed in a number of steps. We evaluate
the performance for the query which has two execution
steps.</p>
        <p>1. Several regions are scanned. After the scan results
are send to the client (query initiator machine).
2. Some of the objects obtained on the first step are
updated. Updates take place in the same regions,
and thus are performed by the same region servers.</p>
        <p>The number of nodes participating in query
execution is distributed according to Poisson distribution with
mean M . The number of data objects query reads per
region server is exponentially distributed with the mean
Nr, writes count is distributed in a similar way with the
mean Nw. Reads and writes are distributed among the
nodes uniformly.</p>
        <p>The 99%-1% data access pattern is used. 99% of
transactions references 1% of data objects. In our model
the data access pattern influences both the buffer pool hit
rate and the data contention.</p>
        <p>For the model simplicity we assumed that the data
object version has a page size. It is reasonable assumption,
because HBase was not designated to work with objects
of small size. Thus, the granule for CC algorithm is
represented by a page in our model.</p>
        <p>Workload parameters can be found in the Table 2.
4.3</p>
      </sec>
      <sec id="sec-4-3">
        <title>Query Execution Model</title>
        <p>Each query has a home node. The home node is the client
machine it has arrived to. After a query has arrived, it is
split to a number of subqueries, each of which is local
to one of execution nodes. Each subquery is modeled
as a list of data references (pages) to be processed. For
each subquery the message is sent to the execution site
to start up the execution. Each query joins the Net queue
and consumes CPU time to send a message to execution
sites.</p>
        <p>When the subquery start message arrives to the
execution site, the subquery is created and it joins the Net
queue on the execution site and consumes CPU time
needed to read a message. Than it consumes CPU to
begin execution.</p>
        <p>The subquery execution consists of
Begin-OfExecution (BOE) step, a number of data reference
processing iterations and End-Of-Execution (EOE) step.</p>
        <p>For each data object reference it goes to the buffer
pool to get the data. If the required page is not already
in memory, subquery consumes processor time to start
IO and joins the disk queue. Than the subquery goes to
CPU queue and consumes time to process data reference
(to find appropriate version). In case there are some more
references the subquery repeats a similar data reference
processing iterations.</p>
        <p>After the subquery has successfully finished its
execution it sends requested data (if present) and the READY
message to the home node. After that, the subquery is
finished, so it goes to CPU queue and consumes time for
EOE step.</p>
        <p>The client receives the data from all the participated
servers, process it and sends a message to each
participant to perform updates of the second execution stage.</p>
        <p>A write subquery is executed in the similar way with
a read subquery. Its behaviour differs in data processing
iteration. The write subquery firstly consumes CPU for
reference processing and after that writes the log page to
the file system and enqueues the page write (it does not
wait until the page will be written).
4.4</p>
      </sec>
      <sec id="sec-4-4">
        <title>Transaction Execution Model</title>
        <p>Read subtransactions do not differ from read subqueries
in their execution model. Although they may consume
more CPU time for a data reference processing to find
appropriate version, the performed steps are same.</p>
        <p>Write subtransaction performs version check before
each write. If the version check failed, the transaction is
to be aborted, and subtransaction goes to the Net node
to send an ABORT message. The probability of version
check success will be discussed later.</p>
        <p>The probability that versions needed for version check
were not flushed to a file since the transaction had started
is quite high for not write intensive workload. Therefore,
the version check step is modeled as processing of Nvc
pages, each of which is already in buffer pool, so disk IO
is not needed.</p>
        <p>After the write subtransaction has finished execution
it sends READY to the home node and waits for
COMMIT or ABORT message in reply. The transaction
initiator waits until all READY messages (or one ABORT
message) will be received. Than it sends the COMMIT
(ABORT) message to all executors and the transaction
is finished. After the subquery received the COMMIT
(ABORT) message, it writes a log page and goes to the
CPU queue to perform the EOE step.
4.5</p>
      </sec>
      <sec id="sec-4-5">
        <title>Abort Probability</title>
        <p>Let us consider the probability of version check failure.
Suppose the transaction t which was started at the
moment u0 is going to update the value of data object x at
the moment u.</p>
        <p>The failure of version check may be caused by two
types of transactions that had updated x recently.
1. x may been written by the transaction which was
committed after t had started. Given the throughput
of the server T (u) for the moment u, the number of
transactions committed in the time interval [u0; u]
can be approximated by Nw T (u) (u u0).
2. x may been written by the transaction, that has not
already committed. Let A(u) denote the number
of write subtransaction active at the server as for
the moment u. The average number of writes made
by active subtransactions may be approximated by
Nw=2. The number of writes made by all active
transaction as for a moment u may be estimated
with Nw A(u)=2.</p>
        <p>The count of updates written by transactions which
execution interval overlaps with execution interval of t
may be approximated by</p>
        <p>K(u; u0) = Nw</p>
        <p>A(u) + 2 T (u) (u</p>
        <p>u0)
2
Let us consider the a-b data access pattern and the case
when t belongs to majority of transactions. The
number of updates made by transactions of major class is
a K(t; u), while the number of data objects t can access
is D b. The probability of observing update made by a
transaction of the same class is
a</p>
        <p>K(u; u0)</p>
        <p>D b
The probability of observing updates made by
transactions of the other class is
(1
a)</p>
        <p>K(u; u0)
D
b
Thus, for a transaction of the first type the probability of
version check failure can be estimated by</p>
        <p>P1(u; u0) =
b (1
a) + a</p>
        <p>K(u; u0)</p>
        <p>D
and for a transaction of the second type by</p>
        <p>P2(u; u0) =</p>
        <p>K(u; u0)</p>
        <p>D</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Simulation Results</title>
      <p>The main goal of our performance study consists in
evaluation of performance degradation caused by additional
overheads introduced by the protocol. We measured
the performance of the protocol in terms of the system
throughput and average response time.</p>
      <p>We evaluated the throughput degradation for a
particular parameter settings as the difference between the EC
and SI throughputs divided by EC throughput.</p>
      <p>In this section we use the abbreviation EC to denote
HBase version, which uses eventual consistency, and SI
for HBase, which uses our protocol. For most of the
experiments we present two diagrams: one depicts normal
workload results, while the other reflects the situation
when all the available resources are already saturated.
We have payed a special attention to the saturated
system performance to examine the influence of transaction
aborts on the throughput.</p>
      <p>As expected the use of distributed commit protocol
does not make considerable contribution to the average
response time for the long-running transactions. The disk
system appears to be the bottleneck for this kind of
workload. The performance of the system is substantially
influenced by the buffer pool hit rate.</p>
      <p>Fig. 7 gives response time against buffer pool hit rate
for the system running 70 queries. Response time is not
as sensible to buffer pool hit rate as throughput. The
graph is close to linear. However, relative response time
increase grows rapidly with buffer pool hit rate getting
closer to 1 and reaches the maximum of 6.25% for
normal workload and 3.87% for saturated workload.
We have implemented the protocol in HBase. Initially
we have evaluated the protocol performance using the
prototype. We have measured the prototype performance
for a workload, which consisted of short-running queries.
Each query read and updated 3 values of double type.
The prototype has shown relatively good results for such
workload: the throughput was 3 times lower than that of
initial HBase version.</p>
      <p>To validate our model mentioned test set was changed.
If each query writes 3 double values, size of log entries
to be flushed to disk before query finishes is small. So
we replaced double values with 4Kb sized byte arrays.
After the changes had been made we discovered HBase
throughput being ten times greater than that of the
prototype.</p>
      <p>We suppose the prototype implementation showed
such a poor performance, because it copies data objects
for internal purposes. For every single get and put
operation at least one data object is copied. We suppose
that despite the fact that main memory reads and writes
are extremely fast, copying of data objects may affect the
performance in case of no disk accesses.</p>
      <p>The values of model parameters for EC were selected
in such a way, that EC throughput was as close as
possible to HBase throughput. The experiment conducted
with the same parameters using SI model has shown the
throughput 1.5 times lower than for EC (1200 vs. 1800).</p>
      <p>To have the SI model performance close to that of the
prototype, we adjusted the mean page processing time
parameter to be 270000 instruction instead of default
25000. The primary goal of this experiment was to
validate the abort probability model. Fig. 8 shows the
prototype throughput and SI model throughput, and 9 shows
abort rates obtained. The difference between the aborts
rates obtained from the model and the prototype has not
exceeded 3% being about 2% at average. We conclude
that our model captures the system behaviour adequate.</p>
    </sec>
    <sec id="sec-6">
      <title>Summary</title>
      <p>
        In this work we presented SI protocol and evaluated its
performance. The advantage of the protocol under EC is
obvious: the data storage user is provided with SI
consistency guarantees. However, the protocol introduces
several additional overheads, which may affect the
performance. We have modeled the performance for the
particular kind of workload and validated the model using
the prototype we have presented in [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]. Although, the
protocol implementation prototype has shown quite poor
performance, it does not imply that the protocol is
ineffective itself. The simulation results has shown that use
of the protocol does not lead to significant performance
degradation for this workload type.
      </p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>Rakesh</given-names>
            <surname>Agrawal</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Michael J.</given-names>
            <surname>Carey</surname>
          </string-name>
          , and
          <string-name>
            <given-names>Miron</given-names>
            <surname>Livny</surname>
          </string-name>
          .
          <article-title>Concurrency control performance modeling: Alternatives and implications</article-title>
          .
          <source>ACM Transactions on Database Systems</source>
          ,
          <volume>12</volume>
          (
          <issue>4</issue>
          ):
          <fpage>609</fpage>
          -
          <lpage>654</lpage>
          ,
          <year>1987</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>Hal</given-names>
            <surname>Berenson</surname>
          </string-name>
          , Phil Bernstein, Jim Gray, Jim Melton,
          <string-name>
            <surname>Elizabeth O'Neil</surname>
          </string-name>
          , and
          <string-name>
            <surname>Patrick O'Neil</surname>
          </string-name>
          .
          <article-title>A critique of ANSI SQL isolation levels</article-title>
          .
          <source>In Proceedings of the 1995 ACM SIGMOD international conference on Management of data</source>
          , volume
          <volume>24</volume>
          , pages
          <fpage>1</fpage>
          -
          <lpage>10</lpage>
          , New York,
          <year>1995</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>Fay</given-names>
            <surname>Chang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Jeffrey</given-names>
            <surname>Dean</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Sanjay</given-names>
            <surname>Ghemawat</surname>
          </string-name>
          , Wilson C.
          <article-title>Hsieh, Deborah A</article-title>
          .
          <string-name>
            <surname>Wallach</surname>
            , Mike Burrows, Tushar Chandra,
            <given-names>Andrew</given-names>
          </string-name>
          <string-name>
            <surname>Fikes</surname>
            , and
            <given-names>Robert E.</given-names>
          </string-name>
          <string-name>
            <surname>Gruber</surname>
          </string-name>
          .
          <article-title>Bigtable: A distributed storage system for structured data</article-title>
          .
          <source>In Proceedings of the 7th USENIX Symposium on Operating Systems Design and Implementation</source>
          , volume
          <volume>7</volume>
          , pages
          <fpage>295</fpage>
          -
          <lpage>310</lpage>
          ,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>Khuzaima</given-names>
            <surname>Daudjee</surname>
          </string-name>
          and
          <string-name>
            <given-names>Kenneth</given-names>
            <surname>Salem</surname>
          </string-name>
          .
          <article-title>Lazy database replication with Snapshot Isolation</article-title>
          .
          <source>In Proceedings of the 32nd international conference on Very Large Databases</source>
          ,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>Robert</given-names>
            <surname>Marek</surname>
          </string-name>
          and
          <string-name>
            <given-names>Erhard</given-names>
            <surname>Rahm</surname>
          </string-name>
          .
          <article-title>Performance evaluation of parallel transaction processing in Shared Nothing database systems</article-title>
          .
          <source>In Proceedings of the 4th International PARLE Conference on Parallel Architectures and Languages Europe</source>
          , pages
          <fpage>295</fpage>
          -
          <lpage>310</lpage>
          , Paris,
          <year>1992</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>Matthias</given-names>
            <surname>Nicola</surname>
          </string-name>
          and
          <string-name>
            <given-names>Matthias</given-names>
            <surname>Jarke</surname>
          </string-name>
          .
          <article-title>Performance modeling of distributed and replicated databases</article-title>
          .
          <source>IEEE Transactions on Knowledge and Data Engineering</source>
          ,
          <volume>12</volume>
          (
          <issue>4</issue>
          ),
          <year>2000</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>Erhard</given-names>
            <surname>Rahm</surname>
          </string-name>
          .
          <article-title>Parallel query processing in Shared Disk database systems</article-title>
          .
          <source>In Proceedings of 5th Int. Workshop on High Performance Transaction Systems</source>
          , Asilomar,
          <year>1993</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>Pierangelo</given-names>
            <surname>Di</surname>
          </string-name>
          <string-name>
            <surname>Sanzo</surname>
          </string-name>
          , Bruno Ciciani, and
          <article-title>Francesco Quaglia Sapienza. A performance model of multi-version concurrency control</article-title>
          .
          <source>In Proceedings of IEEE International Symposium on Modeling, Analysis and Simulation of Computers and Telecommunication Systems</source>
          , pages
          <fpage>1</fpage>
          -
          <lpage>10</lpage>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>Naval</given-names>
            <surname>Postgraduate</surname>
          </string-name>
          <string-name>
            <surname>School</surname>
          </string-name>
          ,
          <year>March 2010</year>
          . Simkit.
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>Y.C.</given-names>
            <surname>Tay</surname>
          </string-name>
          .
          <article-title>Issues in modelling locking performance</article-title>
          . In Hideaki Takagi, editor,
          <source>Stochastic Analysis of Computer and Communication</source>
          . Elsevier Science Publishers
          <string-name>
            <surname>B.V.</surname>
          </string-name>
          (North-Holland), New York,
          <year>1990</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>Alexander</given-names>
            <surname>Thomasian</surname>
          </string-name>
          .
          <article-title>Concurrency control: Methods, performance, and analysis</article-title>
          .
          <source>ACM Computing Surveys</source>
          ,
          <volume>30</volume>
          (
          <issue>1</issue>
          ),
          <year>1998</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>Dmitri</given-names>
            <surname>Vasilik</surname>
          </string-name>
          .
          <article-title>Implementing Snapshot Isolation in HBase</article-title>
          .
          <source>Diploma thesis</source>
          , Saint Petersburg State University,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>Hoang</given-names>
            <surname>Tam</surname>
          </string-name>
          <string-name>
            <surname>Vo</surname>
          </string-name>
          , Chun Chen, and Beng Chin Ooi.
          <article-title>Towards elastic transactional cloud storage with range query support</article-title>
          .
          <source>Proceedings of the VLDB Endowment</source>
          ,
          <volume>3</volume>
          (
          <issue>1-2</issue>
          ),
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>Chen</given-names>
            <surname>Zhang</surname>
          </string-name>
          and Hans De Sterck.
          <article-title>Supporting multirow distributed transactions with Global Snapshot Isolation using bare-bones HBase</article-title>
          .
          <source>In Proceedings of the 11th ACM/IEEE International Conference on Grid Computing (Grid</source>
          <year>2010</year>
          ), pages
          <fpage>295</fpage>
          -
          <lpage>310</lpage>
          , Brussels,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>