A Client/Server Database System with improved methods for providing access
to highly-concurrent data, such as of B-Tree data structures, is
described. When the system receives a request to insert a key value into a
B-Tree at page that does not have sufficient room, the system must split
at the tree at the leaf level. This is done by allocating a new page, and
moving some of the key values from the old page to the new page. The split
itself propagates upward. To do the split itself, the system obtains
address locks for the two pages, and marks both as undergoing "split"
(i.e., a split operation)--the system sets a Boolean flag or "split bit"
to "true." When the split is propagated up, a "side entry" is added to the
old page to point to the newly allocated page. The old page, however, may
not have sufficient room for storing this new entry (e.g., when it is
already full). Accordingly in such a case, the parent page must split
also. This is done by allocating a new page, at that level. Both pages,
old and new parents, are marked as undergoing split. As before, the system
obtains address locks for these pages as well. At this point, a side entry
is created in the old parent page. This information serves to let any
client which is searching for key value (or greater) know that, instead of
going directly down the tree from the old parent page, it should proceed
to the parent's new neighboring page. In this manner, a client's traversal
down the tree is not blocked by the split which is currently active. In
effect, the client knows how to take a detour to arrive ultimately at the
proper leaf-level page. After split propagation is complete, the system
clears the split flags and releases address locks. Also at this point, the
side entry is removed. Now, sufficient room now exists in the tree for
inserting the key value.
Un sistema client/Server de la base de datos con los métodos mejorados para proporcionar el acceso a los datos alto-concurrentes, por ejemplo de las estructuras de datos del B-A'rbol, se describe. Cuando el sistema recibe una petición de insertar un valor dominante en un B-A'rbol en la página que no tiene suficiente sitio, el sistema debe partir en el árbol en el nivel de la hoja. Esto es hecha asignando una página nueva, y moviendo algunos de los valores dominantes desde la vieja página a la página nueva. La fractura sí mismo propaga hacia arriba. Para hacer la fractura sí mismo, el sistema obtiene las cerraduras de la dirección para las dos páginas, y marca ambos mientras que experimentando "parta" (es decir, un operation) partido -- el sistema fija una bandera boleana o "parta el pedacito" "verdad." Cuando la fractura se propaga para arriba, una "entrada lateral" se agrega a la vieja página al punto a la página nuevamente asignada. La vieja página, sin embargo, puede no tener suficiente sitio para almacenar esta nueva entrada (e.g., cuando es ya llena). Por consiguiente en tal caso, la página del padre debe partir también. Esto es hecha asignando una página nueva, en ese nivel. Ambos viejos y nuevos padres de las páginas, están marcados como experimentando fractura. Como antes, el sistema obtiene las cerraduras de la dirección para estas páginas también. A este punto, una entrada lateral se crea en la vieja página del padre. Esta información sirve dejó a cualquier cliente que esté buscando para el valor dominante (o mayor) sabe que, en vez de ir directamente abajo del árbol de la vieja página del padre, debe proceder a la página vecina nueva del padre. De este modo, la llanura traversal de un cliente el árbol no es bloqueada por la fractura que es actualmente activa. En efecto, el cliente sabe tomar un desvío para llegar en última instancia la página apropiada del hoja-nivel. Después de que la propagación partida sea completa, el sistema despeja las banderas partidas y los lanzamientos tratan las cerraduras. También a este punto, se quita la entrada lateral. Ahora, el suficiente sitio ahora existe en el árbol para insertar el valor dominante.