Fact-checked by Grok 2 weeks ago

Precedence graph

A precedence graph is a used in to model dependencies and ordering constraints between entities, such as tasks in parallel scheduling or transactions in database systems, where nodes represent the entities and directed edges indicate that one must precede another to satisfy correctness or optimality criteria. In the context of database , a —also known as a or —serves as a to assess conflict serializability of schedules. Nodes correspond to individual , and an edge from T_i to T_j is added if an in T_i conflicts with a subsequent in T_j (involving the same item with at least one write), ensuring that the schedule can be rearranged into an equivalent execution without altering conflict outcomes. A schedule is conflict serializable if and only if its is acyclic, allowing a to define a valid execution sequence; cycles indicate potential non-serializability and concurrency anomalies. In parallel and , precedence graphs model task dependencies for scheduling problems on multiprocessors or in systems, typically as directed acyclic graphs (DAGs) where edges enforce execution order to minimize completion time or resource usage. These graphs enable algorithms to compute optimal or approximate schedules by analyzing structural properties like height, width, or density, influencing decisions in fields such as optimization and .

Fundamentals

Definition

A precedence graph is a where the nodes represent tasks, operations, or events, and the directed edges capture precedence constraints, such that the completion of the source node is required before the node can commence. In many applications, such as task scheduling, the graph is acyclic to ensure feasible execution without circular dependencies; however, in contexts like analysis, cycles may be present and are used to detect issues like non-serializability. For instance, a directed edge from A to B indicates that task A must precede task B in any valid execution sequence. In this structure, nodes correspond to the individual elements subject to ordering, edges represent the direct precedence relations between them, and the of these relations can induce a partial order on the set of nodes if the graph is acyclic, defining which elements must occur before others without specifying a total linear arrangement. This partial order ensures that the dependencies are respected while allowing flexibility in sequences where no direct constraint exists. The concept emerged in the 1960s within and to model dependencies in and parallel processing environments. John W. Fondahl's 1961 technical report introduced precedence diagramming as a manual alternative to arrow diagramming for critical path analysis in construction projects, emphasizing node-based representations of tasks and their sequential relationships. Concurrently, T. C. Hu's work that year addressed scheduling problems with ordering restrictions on parallel processors, establishing early algorithmic foundations for handling such graphs. Distinguishing precedence graphs from undirected graphs, the edges are inherently directed and asymmetric, enforcing a one-way ordering rather than mutual relations, and acyclicity is often assumed to permit topological sorting and feasible execution plans.

Formal representation

A precedence graph is formally defined as a directed graph G = (V, E), where V is the finite set of vertices representing tasks or operations, and E \subseteq V \times V is the set of directed edges encoding strict precedence constraints, with an edge u \to v indicating that task u must be completed before task v can begin. This structure ensures that the graph is acyclic to avoid circular dependencies in many applications, though the formal representation itself does not enforce acyclicity. The provides a compact matrix-based encoding of the precedence graph, defined as a |V| \times |V| matrix A where A_{ij} = 1 if there is a directed from i to j (indicating i precedes j), and A_{ij} = 0 otherwise. This representation facilitates efficient computations, such as matrix operations for analyzing dependencies. The of the precedence graph captures the relation, representing all implied precedences through paths of any length; it can be computed using Warshall's , which iteratively updates the to include entries for indirect dependencies. Specifically, starting from the A, Warshall's algorithm produces a matrix A^* where (A^*)_{ij} = 1 if there exists a from i to j, thereby determining the full set of transitive precedences. If the precedence graph is acyclic, it induces a strict partial order \prec on the vertex set V, defined such that for distinct a, b \in V, a \prec b if and only if there is a directed path from a to b in G, corresponding to the relation. This partial order is irreflexive and transitive, reflecting the asymmetric nature of precedence without requiring comparability for all pairs.

Properties and Analysis

Key properties

In contexts such as task scheduling, a precedence graph is typically a (DAG), characterized by the absence of directed , which ensures that all specified precedences can be satisfied without contradiction. If a exists, it would imply an impossible among the nodes, making the graph invalid for representing feasible orderings. This acyclicity is a core requirement in both task-on-node and task-on-arc representations of precedence constraints. Precedence graphs exhibit irreflexivity, meaning no self-loops are present (i.e., no precedes itself), and , where the directed edges preclude bidirectional connections between distinct nodes, as such pairs would form a of length two. These properties align the with a strict partial order, preventing reflexive or symmetric relations that could undermine the directional precedence semantics. The acyclicity of precedence graphs (where applicable) guarantees the existence of a —a linear arrangement of nodes where every directed edge points from an earlier to a later —providing a total ordering consistent with all precedences. This ordering can be constructed algorithmically and is essential for sequencing tasks or operations without violations. In the context of partial orders induced by precedence graphs in scheduling, applies, stating that the minimum number of chains needed to cover the poset equals the size of the largest . This duality bounds the degree of parallelism possible in scheduling, as the size represents the maximum number of concurrently executable tasks.

Cycle detection

Cycle detection is a critical step in analyzing precedence graphs. In applications like task scheduling, these graphs are intended to model acyclic dependencies, so the presence of a violates this assumption and must be identified to ensure feasibility. In database , in the precedence (serialization) graph indicate that the schedule is not conflict serializable. The standard for detecting in directed graphs, such as precedence graphs, employs (DFS) augmented with a coloring scheme to track the visitation status of : white for unvisited, gray for currently being explored (in the recursion stack), and black for fully explored. During traversal, if an leads to a gray , a back edge is detected, confirming a ; otherwise, the graph is acyclic. This approach runs in linear time relative to the size, specifically O(|V| + |E|), where |V| is the number of vertices (tasks or transactions) and |E| is the number of edges (dependencies). The discovery of a in a precedence graph has significant implications. In task , it signals unschedulable dependencies, where no valid ordering exists without violating constraints. In database systems, it indicates non-conflict-, potentially leading to concurrency anomalies if the schedule is allowed. Such cycles often arise from conflicting operation orders. Resolution depends on context: in , it may involve reordering tasks to eliminate mutual dependencies or aborting affected components; in databases, the schedule is typically or transactions rolled back to ensure . To facilitate cycle detection, especially in dense precedence graphs, transitive reduction can be applied first; this process removes redundant edges that do not alter between nodes, yielding a minimal equivalent with fewer edges to traverse during DFS. The resulting sparser structure preserves the original 's while simplifying analysis, as cycle checks operate on a reduced edge set without introducing or hiding cycles. For directed acyclic graphs (DAGs), the transitive reduction is unique and computable in polynomial time. The following illustrates a recursive DFS implementation for in a precedence graph G = (V, E), where color tracks states, parent avoids immediate , and a is reported upon encountering a back edge to a gray :
function DFS(u):
    color[u] = GRAY  // Mark as visiting
    for each neighbor v of u:
        if color[v] == WHITE:
            parent[v] = u
            if DFS(v):
                return true  // Cycle found
        elif color[v] == GRAY and v != parent[u]:
            return true  // Back edge to [ancestor](/page/Ancestor)
    color[u] = BLACK  // Mark as visited
    return false

// Main call: Initialize color to WHITE for all [node](/page/Node)s
for each [node](/page/Node) u in [V](/page/V.):
    if color[u] == WHITE:
        if DFS(u):
            return "Cycle detected"
return "No cycle"
This leverages the to identify back edges, ensuring all components are checked.

Applications

In task scheduling

In task scheduling, precedence graphs serve as a fundamental model for representing dependencies among tasks in multiprocessor systems, where nodes denote individual tasks and directed edges indicate the order in which tasks must be executed to ensure correctness and efficiency. This structure enables the identification of feasible execution sequences by adhering to topological orders, allowing execution on multiple processors while respecting constraints to minimize overall completion time, known as the . A key application lies in the (CPM), which uses precedence graphs to compute the longest path through the graph—termed the critical path—representing the sequence of dependent tasks that determines the earliest possible finish time for the entire schedule. Developed in the late , CPM analyzes project networks to allocate resources and estimate timelines by calculating earliest and latest start times for each task, highlighting those with zero that cannot be delayed without extending the project duration. This method has been widely adopted in and projects for its ability to focus efforts on dependencies. List scheduling algorithms further leverage precedence graphs by assigning ready tasks—those with all predecessors completed—to available processors in a greedy manner, often prioritizing tasks based on heuristics like highest level (longest remaining path) or earliest deadline to approximate optimal . Introduced in seminal work on anomalies, this approach guarantees a makespan no more than twice the optimal for identical processors, providing an efficient for large-scale task graphs despite the underlying problem's complexity. In practice, variants incorporate dynamic lists to balance load across processors while enforcing precedence edges. Probabilistic extensions of precedence graphs appear in (PERT) charts, where edges represent activities with associated expected durations derived from optimistic, most likely, and pessimistic estimates using a to model uncertainty. PERT computes probabilistic project completion times by forward and backward passes through the , estimating the variance along paths to assess risks in timelines for projects. This framework, originating from U.S. Navy applications, enhances by incorporating stochastic elements for more realistic timeline predictions in uncertain environments. When resource constraints limit the number of available processors, precedence graphs integrate with to address NP-hard problems, such as minimizing under precedence constraints on parallel identical machines, which remains intractable even for two processors. Seminal complexity results establish that deciding whether a exists within a given bound is NP-complete, motivating approximation algorithms like list scheduling that perform well in polynomial time for practical multiprocessor systems with bounded parallelism. These integrations are crucial in , where limited resources amplify the impact of dependency chains on overall performance.

In database transactions

In database transactions, precedence graphs, also known as graphs or graphs, serve as a fundamental tool for ensuring the correctness of concurrent executions by testing for serializability. A precedence graph is constructed for a given of transactions, where nodes represent transactions and directed edges indicate conflicts arising from operations on the same items, such as one transaction writing a value that another reads or writes. If an edge points from transaction Ti to Tj, it signifies that Ti must precede Tj in any equivalent serial to preserve the outcome of conflicting operations. This graph-based approach allows database management systems (DBMS) to verify whether a concurrent can be transformed into an equivalent serial one without altering the result, thereby maintaining under concurrency. Central to serializability theory, a is conflict serializable if and only if its precedence graph is acyclic, meaning there exists a of transactions that matches some execution. This equivalence ensures that the concurrent produces the same final database state as a one, preventing anomalies like lost updates or inconsistent reads. For instance, in a where transaction T1 writes to item X followed by T2 reading X, an edge T1 → T2 is added; cycles in the graph, such as T1 → T2 → T1, indicate non-serializability and potential inconsistencies. This test, rooted in formal models of histories, underpins concurrency control mechanisms in DBMS to enforce isolation levels. For more advanced serializability checks, particularly view serializability—which allows additional schedules with blind writes not captured by conflict serializability—the polygraph extends the precedence graph by incorporating hypothetical transactions and bipaths to model conditional dependencies. A polygraph includes nodes for actual transactions plus auxiliary ones (e.g., T0 for initial values), with edges for read-write and write-write dependencies, and bipaths representing possible orderings of blind writes. A schedule is view serializable if the polygraph contains no cycles, enabling equivalence to a serial schedule in terms of reads-from relationships and final writes. This extension proves useful in scenarios with nested transactions, where conditional dependencies arise from subtransactions, allowing finer-grained analysis of complex, hierarchical executions. The use of precedence graphs in database transactions emerged in the and as part of foundational research, with early theoretical developments addressing in systems like IBM's System (IMS), which incorporated locking protocols to manage concurrent access in hierarchical databases. Seminal work formalized these graphs to prove correctness in multiprogrammed environments, influencing protocols like . In modern DBMS such as , serialization graphs are integral to the Serializable isolation level via Serializable Snapshot Isolation (SSI), where dependency tracking detects cycles at commit time to abort conflicting transactions and ensure acyclicity.

Construction and Algorithms

Building a precedence graph

Constructing a precedence graph begins with identifying the nodes, which represent the fundamental entities such as tasks in scheduling problems or transactions in database concurrency control. In task scheduling, nodes correspond to activities derived from a work breakdown structure, while in databases, they represent individual transactions. The next step involves determining direct precedences from specified constraints to form the edges of the . For task dependencies, this entails listing activities and their immediate predecessors from a precedence table or dependency list, where an is added from predecessor to successor activity. In database contexts, are drawn between nodes based on conflicting operations—such as a read-write or write-write on the same item—with the from the earlier-accessing to the later one. Implied orders, arising from transitive dependencies (e.g., if A precedes B and B precedes C, then A implicitly precedes C), can be incorporated by adding transitive during construction, though this is optional for initial builds. Input sources for building the graph vary by domain and include explicit dependency lists or precedence tables for scheduling, Gantt charts that encode activity sequences and relationships, or transaction logs in that log operation timestamps and data accesses for conflict identification. Explicit dependencies are directly stated in these sources, such as mandatory predecessor-successor pairs, while implicit ones—stemming from logical or resource constraints—are inferred during addition to ensure completeness without redundancy. Practical construction often leverages graph libraries for efficiency. In , the NetworkX library facilitates this by initializing a with nx.DiGraph(), adding nodes via add_nodes_from(), and edges via add_edges_from() to model precedences programmatically. For visualization during the building phase, renders the as a diagram using language descriptions, aiding in verification of node-edge alignments. Validation during construction ensures graph integrity by checking for invalid structures like self-loops, which would imply a task or preceding itself and are thus prohibited, or multiple edges between the same pair of nodes, which are consolidated into single directed edges in simple . These checks, performed via methods or manual inspection, help maintain a clean representation aimed at acyclicity.

Serialization algorithms

Serialization algorithms leverage precedence graphs, which are directed acyclic graphs (DAGs) representing dependencies, to produce linear orderings that respect all constraints. These orderings, known as topological sorts, ensure that for every directed from u to v, u appears before v in the sequence. This process is fundamental to in domains like task scheduling and , where maintaining dependency order prevents violations such as deadlocks or inconsistencies. One prominent algorithm for topological sorting is Kahn's algorithm, which operates using indegrees. It begins by initializing a with all s having indegree zero (no incoming edges), representing tasks or entities with no prerequisites. The algorithm repeatedly dequeues a , adds it to the ordering, and decreases the indegrees of its neighbors; if a neighbor's indegree reaches zero, it is enqueued. This continues until the is empty, yielding a valid if and only if the is acyclic. An alternative approach is the (DFS)-based topological sort, which uses recursive traversal. Starting from each unvisited , DFS explores all outgoing edges first, marking nodes as visited to avoid cycles. Upon completing the exploration of a 's descendants, the is appended to the front of the result list (or pushed onto a and reversed at the end). The final reverse post-order provides the topological sequence, ensuring dependencies are resolved before their dependents. In database systems, precedence graphs—often called —model conflicts between to enforce . Thomas' write rule enhances timestamp-ordering protocols by pruning obsolete write operations: if a T_i attempts to write a data item after a later T_j has already written it (based on timestamps), T_i's write is ignored rather than causing an abort. This rule removes potential edges in the that would represent unnecessary conflicts, permitting schedules that are view-serializable but not necessarily conflict-serializable, thus improving concurrency without sacrificing correctness. Two-phase locking (2PL) integrates with precedence graphs by structuring lock acquisition into a growing (acquiring locks) followed by a shrinking (releasing locks), with no interleaving. This ensures conflict serializability, as the serialization graph induced by lock conflicts remains acyclic: lock requests create directed edges from waiting to holding transactions, and the two-phase discipline prevents cycles. Conservative 2PL variants pre-acquire all locks to further mitigate deadlocks. For applications, level scheduling variants adapt topological ordering to multiprocessor environments. Tasks are partitioned into levels based on the length of the longest path from nodes in the precedence graph, prioritizing higher-level (more dependent) tasks. Scheduling proceeds level-by-level, assigning tasks within a level to available processors to balance loads and minimize ; Hu's exemplifies this for unit-time tasks on identical processors, achieving optimality for in-tree and out-tree graphs. Standard topological sort algorithms, including Kahn's and DFS-based methods, exhibit O(|V| + |E|) , where |V| is the number of vertices and |E| the number of edges, due to single traversals of nodes and edges via adjacency lists. For sparse graphs (where |E| ≈ |V|), this approaches linear time, with optimizations like priority queues in variants reducing constant factors for large-scale applications.

Examples

Simple task dependency example

Consider a basic scenario in involving four interdependent tasks: A (system design), B ( ), C ( testing), and D ( deployment). The precedence constraints require that design (A) must complete before (B) and testing (C) can begin, while both (B) and testing (C) must finish before deployment (D) starts. These relations form a known as a precedence graph, with nodes representing the tasks and directed edges indicating dependencies: A → B, A → C, B → D, and C → D. The is typically visualized with nodes positioned in from left to right or top to bottom: A positioned first, followed by B and C at the same level to reflect their independence after A, and D last. Edges connect A to B and A to C, with B and C both linking to D. The critical path in this graph is the longest of dependent tasks, such as A → B → D or A → C → D, which determines the minimum project duration if task times vary. Assuming unit execution times for each task (one time unit per task), a valid respecting the precedences executes A in the first unit, followed by B and C in parallel during the second unit (leveraging multiple processors or resources), and D in the third unit. This yields a of three time units. Alternative serial schedules, such as A → B → C → D, would extend the to four units, underscoring the graph's role in identifying opportunities for parallelism between independent tasks like B and C.

Transaction serializability example

Consider two , T1 and T2, operating on shared data items X and Y in a database . T1 performs a read on X followed by a write on Y, while T2 performs a read on Y followed by a write on X. In a concurrent such as r1(X) r2(Y) w1(Y) w2(X), conflicting operations arise: the read-write between r1(X) and w2(X) creates a precedence edge T1 → T2, and the read-write between r2(Y) and w1(Y) creates a precedence edge T2 → T1. The resulting precedence graph has nodes representing T1 and T2, with directed edges labeled by conflict types: a read-write edge from T1 to T2 for the dependency on X, and a read-write edge from T2 to T1 for the dependency on Y. This forms a in the , indicating that the schedule is not conflict serializable, as no exists that respects all precedence constraints. To resolve the non-serializability and ensure , the database detects the cycle during execution and aborts T2, allowing T1 to complete first, followed by a restart of T2. This enforces a serial order equivalent to T1 then T2, preventing anomalies such as lost updates or inconsistent reads. In contrast, permitting the parallel execution without intervention could lead to inconsistent database states, where T1 reads an outdated X while overwriting Y based on T2's read, violating the property of transactions. By using the precedence graph for , the system guarantees anomaly-free execution akin to serial schedules.

References

  1. [1]
    [PDF] Review Review Outline Conflicting Operations Conflict Serializable ...
    Theorem: Schedule is conflict serializable if and only if its dependency graph is acyclic. ('dependency graph': a.k.a.'precedence graph'). Page 3. 15 ...
  2. [2]
    [PDF] Scheduling Wide Graphs - Stanford University
    In this paper we explore the relation8 between the structure of the precedence graph (the partial order) and optimal schedules. We prove that in finding an ...
  3. [3]
    [PDF] Chapter 15: Transactions - CS@Purdue
    size of the precedence graph. ▫ The problem of checking if a schedule is view serializable falls in the class of NP-complete problems.
  4. [4]
    [PDF] Scheduling Flat Graphs - CS.HUJI
    The precedence constraints between tasks are represented by a precedence graph, which is a directed acyclic graph. As in [GJ81] we allow the number of ...
  5. [5]
    [PDF] 17.5.1 Motivation - cs.wisc.edu
    We represent precedence constraints using a graph G = (V,E), where E contains the dependencies between tasks in V . We denote the dependency of task j on the ...
  6. [6]
    [PDF] Scheduling Precedence Graphs of Bounded - Manfred K. Warmuth
    A precedence graph G specifies the precedence constraints between the vertices (tasks) of. G. We assume that if a task x has to be executed before a task y, ...
  7. [7]
    [PDF] How the structure of precedence constraints may change the ... - HAL
    Jan 24, 2017 · Three seminal works on parallel machines with precedence constraints are the approaches of Hu [1961],. Papadimitriou and Yannakakis [1979] and ...
  8. [8]
    [PDF] Scheduling problems with production and consumption of resources
    Feb 11, 2018 · where the precedence graph G = (X, U) consists of a set of SP (≥ 2) ... The adjacency matrix A of graph G is de ned to be the |X|×|X ...
  9. [9]
    [PDF] Work Efficient Parallel Scheduling Algorithms - mediaTUM
    We assume that the precedence graph is given as an adjacency matrix and each task is represented by a natural number, i.e., T X {1, x x x ,n}. In the.<|separator|>
  10. [10]
    [PDF] direct algorithms for computing the transitive closure
    We motivate the rationale of the Blocked Warshall algorithm through an example. Suppose that the graph is such that there are arcs from node 3 to nodes. 1 and 2 ...
  11. [11]
    Algorithms to schedule tasks with AND/OR precedence constraints
    This is one of the differences between ANDonly graphs and AND/OR graphs. Special provisions must be made to compute the transitive closure of an AND/OR graph.
  12. [12]
    [PDF] Review of properties of different precedence graphs for scheduling ...
    In a standard way, the task precedence constraints of a scheduling problem are repre- sented by a directed graph. A directed graph (or digraph) is said to be ...
  13. [13]
    [PDF] Topologically Sorting a Directed Acyclic Graph
    A topological order is an order of the vertices that satisfies all the edges. • Example: Dressing (arrow implies “must come before”). Underwear. Pants. Belt.
  14. [14]
    [PDF] CSC263 Week 9
    A graph is cyclic if and only if. DFS yields a back edge. That's useful! Page 47. A (directed) graph contains a cycle if and.
  15. [15]
    Operating Systems: Deadlocks
    If resource categories have only single instances of their resources, then deadlock states can be detected by cycles in the resource-allocation graphs. In ...
  16. [16]
    [PDF] THE TRANSITIVE REDUCTION OF A DIRECTED GRAPH
    Such minimal representations for graphs are of particular interest for efficiently executing certain computer algorithms, such as the precedence constrained.
  17. [17]
    [PDF] Bounds for certain multiprocessing anomalies - UCSD Math
    XLV, No. 9, November, 1966. Printed in U.S.A.. Bounds for Certain. Multiprocessing Anomalies. By R. L. GRAHAM.
  18. [18]
    [PDF] Critical-Path Planning and Scheduling - Mosaic Projects
    The sec- ond part of this essay will cover the experience and results obtained from the use of the Critical-Path. Method. PART I: ANALYSIS OF A PROJECT. 1.Missing: seminal | Show results with:seminal
  19. [19]
    [PDF] NP-Complete Scheduling Problems*
    We show that the problem of finding an optimal schedule for a set of jobs is NP- complete even in the following two restricted cases.
  20. [20]
    [PDF] Concurrency Control in Database Systems - CS@Purdue
    Abstract—Ideas that are used in the design, development, and performance of concurrency control mechanisms have been summarized. The locking, time-stamp, ...
  21. [21]
    [PDF] The Serializability of Concurrent Database Updates - CS@Purdue
    Serializability means a sequence of updates is as if users took turns, executing their entire transactions individually. This ensures the overall system is ...Missing: seminal | Show results with:seminal
  22. [22]
    [PDF] 19.2 View Serializability - Stanford InfoLab
    We define the polygraph for a schedule to consist of the following: 1. A node for each transaction and additional nodes for the hypothetical transactions T0 and ...
  23. [23]
    [PDF] A Serialization Graph Construction for Nested Transactions - Research
    These prooh are based on the absence of cycles in a “serialization graph,” a graph whose nodes are the transactions and whose edges record conflicts between ...
  24. [24]
    [PDF] Serializable Snapshot Isolation in PostgreSQL
    ABSTRACT. This paper describes our experience implementing PostgreSQL's new serializable isolation level. It is based on the recently-developed.
  25. [25]
    Activity Networks and Precedence Tables - Student Academic Success
    An activity network can be constructed from a precedence table by systematically examining the immediate predecessors and connecting them in a network diagram.
  26. [26]
    Precedence Diagram Method (PDM) - AcqNotes
    Feb 2, 2024 · Precedence Diagram Method (PDM) is a visual representation technique that depicts the activities involved in a project.
  27. [27]
    Tutorial — NetworkX 3.5 documentation
    This guide can help you start working with NetworkX. Creating a graph Create an empty graph with no nodes and no edges.Backends · Install · Gallery · Nx-guides!
  28. [28]
    Graphviz
    Graphviz is open source graph visualization software. Graph visualization is a way of representing structural information as diagrams of abstract graphs and ...DOT Language · Download · Graphviz · Graph Attributes
  29. [29]
  30. [30]
    Topological sorting of large networks | Communications of the ACM
    The present paper presents a very general method for obtaining topological order. It permits treatment of larger networks than can be handled on present ...
  31. [31]
    Topological Sorting - Algorithms for Competitive Programming
    Apr 22, 2025 · You want to find a permutation of the vertices (topological order) which corresponds to the order defined by all edges of the graph.Missing: precedence | Show results with:precedence
  32. [32]
    [PDF] A Majority Consensus Approach to Concurrency Control for Multiple ...
    A “majority consensus” algorithm which represents a new solution to the update synchronization problem for multiple copy databases is presented.Missing: write Richard
  33. [33]
    [PDF] 9. November 1966: Bounds for Certain Multiprocessing Anomalies ...
    Bounds for Certain. Multiprocessing Anomalies. By R. L. GRAHAM. (Manuscript received July 11, 1966). It is known that in multiprocessing systems composed of ...
  34. [34]
  35. [35]
    [PDF] Concurrency Control Conflict Serializable Schedules Example
    Xact can get a lock (S or X) on that object. Strict 2PL allows only schedules whose precedence graph is acyclic. Database Management Systems 3ed, R.
  36. [36]
    [PDF] Intro to Transactions - Duke Computer Science
    A schedule that is not conflict serializable: • The cycle in the graph reveals the problem. The output of T1 depends on T2, and vice-versa.Missing: implications | Show results with:implications<|control11|><|separator|>