• No results found

Normalized Tables Unnormalized Tables

RULE 2: All locks held by a transaction are released when the transaction is completed.

9.11 Validation based Protocols

In cases where a majority of transactions are read-only transactions, the rate of conflicts among transactions may be low. Thus, many of these transactions, if executed without the supervision of a concurrency-control scheme, would nevertheless leave the system in a consistent state. A concurrency-control scheme imposes overhead of code execution and possible delay of transactions. It may be better to use an alternative scheme that imposes less overhead. A difficulty in reducing the overhead is that we do not know in advance which transactions will be involved in a conflict. To gain that knowledge, we need a scheme for monitoring the system.

We assume that each transaction Ti executes in two or three different phases in its lifetime, depending on whether it is a read-only or an update transaction. The phases are, in order,

1. Read phase: During this phase, the system executes transaction Ti. It reads the values of the

various data items and stores them in variables local to Ti. It performs all write operations on temporary local variables, without updates of the actual database.

2. Validation phase: Transaction Ti performs a validation test to determine whether it can

copy to the database the temporary local variables that hold the results of write operations without causing a violation of serializability.

3. Write phase: If transaction Ti succeeds in validation (step 2), then the system applies the

actual updates to the database. Otherwise, the system rolls back Ti.

Each transaction must go through the three phases in the order shown. However, all three phases of concurrently executing transactions can be interleaved.

To perform the validation test; we need to know when the various phases of transactions Ti took place. We shall, therefore, associate three different timestamps with transaction Ti:

1. Start(Ti), the time when Ti started its execution.

2. Validation(Ti), the time when Ti finished its read phase and started its validation phase. 3. Finish(Ti), the time when Ti finished its write phase.

We determine the serializability order by the timestamp-ordering technique, using the value of the timestamp Validation(Ti). Thus, the value TS(Ti) = Validation(Ti) and, if TS(Tj) < TS(Tk), then any produced schedule must be equivalent to a serial schedule in which transaction Tj appears before transaction Tk. The reason we have chosen Validation(Ti), rather than Start(Ti), as the timestamp of transaction Ti is that we can expect faster response time provided that conflict rates among transactions are indeed low.

Notes The validation test for transaction Tj requires that, for all transactions Ti with TS(Ti) < TS(Tj), one

of the following two conditions must hold:

1. Finish(Ti) < Start(Tj) Since Ti completes its execution before Tj started, the serializability

order is indeed maintained.

2. The set of data items written by Ti does not intersect with the set of data items read by T,

and Ti completes its write phase before Tj starts its validation phase (Start(Tj) < Finish(Ti) <

Validation(Tj)). This condition ensures that the writes of Ti and Tj do not overlap. Since the

writes of Ti do not affect the read of Tj, and since Tj cannot affect the read of Ti the

serializability order is indeed maintained.

T14 T15 read(B) read(B) B := B – 50 read (A) A := A + 50 read (A) (validate) display (A + B) (validate) write(B) write (A)

As an illustration, consider again transactions T14 and T15. Suppose that TS(T14) < TS(T15). Then, the validation phase succeeds in the schedule 5 in above table.

Notes The writes to the actual variables are performed only after the validation phase of T15. Thus, T14 reads the old values of B and A, and this schedule is serializable.

The validation scheme automatically guards against cascading rollbacks, since the actual writes take place only after the transaction issuing the write has committed. However, there is a possibility of starvation of long transactions, due to a sequence of conflicting short transactions that cause repeated restarts of the long transaction. To avoid starvation, conflicting transactions must be temporarily blocked, to enable the long transaction to finish.

This validation scheme is called the optimistic concurrency control scheme since transactions execute optimistically, assuming they will be able to finish execution and validate at the end. In contrast, locking and timestamp ordering are pessimistic in that they force a wait or a rollback whenever a conflict is detected, even though there is a chance that the schedule may be conflict serializable.

Task Discuss write phase in validation based protocols.

9.12 Deadlock Handling

Consider the following two transactions:

T1: write (X) T2: write(Y)

write(Y) write(X)

Notes A schedule with deadlock is given as:

A system is deadlocked if a set of transactions in the set is waiting for another transaction in the set.

9.12.1 Deadlock Prevention

Deadlock prevention protocols ensure that the system will never enter into a deadlock state. The basic prevention strategies are:

1. The strategies require that each transaction lock all its data items before it begins execution (pre declaration).

2. They impose partial ordering of all data items and require that a transaction can lock data items only in the order specified by the partial order (graph-based protocol).

Two common techniques for deadlock prevention are wait-die and wound-wait. In both the wait-die and wound-wait schemes, a rolled back transaction is restarted with its original timestamp. Older transactions thus have precedence over newer ones, and deadlock is hence avoided.

These schemes use transaction timestamps for the prevention of deadlock. Wait-die scheme — non-preemptive

1. Older transaction may wait for younger one to release data item. Younger transactions never wait for older ones; they are rolled back instead.

2. A transaction may die several times before acquiring the needed data item Wound-wait scheme — preemptive

1. Older transaction wounds (forces rollback) of younger transaction instead of waiting for it. Younger transactions may wait for older ones.

2. May be fewer rollbacks than wait-die scheme.

Timeout-based Schemes

The timeout-based schemes have the following characteristics:

1. A transaction waits for a lock only for a specified amount of time. After that, the wait times out and transaction are rolled back. Thus deadlocks are prevented.

2. Simple to implement; but starvation may occur. Also it is difficult to determine the good value of timeout interval.

Notes Deadlock Detection

Deadlocks can be detected using a wait-for graph, which consists of a pair G = (V,E), 1. V is a set of vertices (all the transactions in the system)

2. E is a set of edges; each element is an ordered pair Ti Tj.

If Ti Tjis in E, then there is a directed edge from Tito Tj, implying that Tiis waiting for Tjto

release a data item. When Tirequests a data item currently being held by Tj, then the edge Ti Tj

is inserted in the wait-for graph. This edge is removed only when Tjis no longer holding a data

item needed by Ti.

The system is in a state of deadlock if the wait-for graph has a cycle. You must make use of a deadlock-detection algorithm periodically to look for such cycles.

9.12.2 Deadlock Recovery

When a deadlock is detected, some transaction will have to be rolled back to break the deadlock. Selecting that transaction, as a victim will incur minimum cost. Rollback will determine the distance the transaction needs to be rolled back. Total rollback aborts the transaction and then restarts it. The more effective method of deadlock recovery is to rollback transaction only as far as necessary to break the deadlock. Starvation occurs if the same transaction is always selected as a victim. You can include the number of rollbacks in the cost factor calculation in order to avoid starvation.

9.13 Insert and Delete Operation