CC 1 - CS-People by full name
Download
Report
Transcript CC 1 - CS-People by full name
Concurrency Control
General Overview
Relational model - SQL
Formal & commercial query languages
Functional Dependencies
Normalization
Transaction Processing and CC
Physical Design
Indexing
Query Processing and Optimization
Transaction Concept
A transaction is a unit of program execution that
accesses and possibly updates various data items.
A transaction must see a consistent database.
During transaction execution the database may be
inconsistent.
When the transaction is committed, the database must
be consistent.
State 1
State 2
ACID Properties
To preserve integrity of data, the database system must ensure:
Atomicity. Either all operations of the transaction are
properly reflected in the database or none are.
Consistency. Execution of a transaction in isolation
preserves the consistency of the database.
Isolation. Each transaction must be unaware of other
concurrently executing transactions.
Durability. After a transaction completes successfully, the
changes it has made to the database persist, even if there
are system failures.
AC[I]D
Isolation
Concurrent xctions unaware of each other
How?
Serial execution of transactions
Poor Throughput and response time
Ensure concurrency
Prevent “bad” concurrency (pessimistic)
Recognize “bad” concurrency, fix (optimistic)
Qualify concurrency through analysis of “schedules”
Review - Schedules
An interleaving of xction operations
T1
1
2
3
T2
A
B
C
D
T1
1
T2
A
B
A schedule for T1,T2
2
3
C
D
•Inter ops: may interleave
•Intra ops: remain in order
Review - Schedules
T1
•Serial Schedule
- All operations of each xction executed together,
xtions executed in succesion
•Serializable schedule
- Any schedule whose final effect matches
that of any serial schedule
T2
1
2
3
A
B
C
T1
T2
1
2
A
B
C
3
Example Schedules
Transactions:
T1: transfers $50 from A to B
T2: transfers 10% of A to B
T1
read(A)
A <- A -50
write(A)
read(B)
B<-B+50
write(B)
Example 1: a “serial” schedule
T2
Constraint: The sum of A+B
must be the same
Before: 100+50
=150, consistent
read(A)
tmp <- A*0.1
A <- A – tmp
write(A)
read(B)
B <- B+ tmp
write(B)
After: 45+105
Example Schedule
Another “serial” schedule:
T1
read(A)
A <- A -50
write(A)
read(B)
B<-B+50
write(B)
T2
read(A)
tmp <- A*0.1
A <- A – tmp
write(A)
read(B)
B <- B+ tmp
write(B)
Before: 100+50
=150, consistent
After: 40+110
Consistent but not the
same as previous schedule..
Either is OK!
Example Schedule (Cont.)
Another “good” schedule:
T1
read(A)
A <- A -50
write(A)
T2
Effect:
read(A)
tmp <- A*0.1
A <- A – tmp
write(A)
read(B)
B<-B+50
write(B)
read(B)
B <- B+ tmp
write(B)
Before
A
100
B
50
After
45
105
Same as one of the serial schedules
Serializable
Example Schedules (Cont.)
A “bad” schedule
T1
read(A)
A <- A -50
T2
read(A)
tmp <- A*0.1
A <- A – tmp
write(A)
read(B)
write(A)
read(B)
B<-B+50
write(B)
Before: 100+50 = 150
After: 50+60 = 110 !!
Not consistent
Non Serializable
B <- B+ tmp
write(B)
Concurrency Control
Concurrency Control
Ensures interleaving of operations amongst
concurrent xctions result in serializable schedules
How?
Xction operations interleaved following a protocol
How to enforce serializable schedules?
Prevent P(S) cycles from occurring using a concurrency control
manager: ensures interleaving of operations amongst
concurrent xctions only result in serializable schedules.
T1 T2 …..
Tn
CC Scheduler
DB
Concurrency Via Locks
Xction , txn : short for transaction
Idea:
Data items modified by one xction at a time
Locks
Control access to a resource
Can block a xction until lock granted
Two modes:
Shared (read only)
eXclusive (read & write)
Granting Locks
Requesting locks
Must request before accessing a data item
Granting Locks
No lock on data item? Grant
Existing lock on data item?
Check compatibility:
– Compatible? Grant
– Not? Block xction
shared
exclusive
shared
Yes
No
exclusive
No
No
Lock instructions
New instructions
- lock-S: shared lock request
- lock-X: exclusive lock request
- unlock: release previously held lock
T1
Example:
lock-X(B)
read(B)
B B-50
write(B)
unlock(B)
lock-X(A)
read(A)
A A + 50
write(A)
unlock(A)
T2
lock-S(A)
read(A)
unlock(A)
lock-S(B)
read(B)
unlock(B)
display(A+B)
Locks
Shared locks
SELECT statements (w/o any updates)
Exception In Oracle: select statements do not obtain any
shared locks: They read from a committed version
(read-consistency protocol).
High throughput for analysis-tread-only queries
Exclusive locks
Update, delete, insert, and select-for-update
Lock individual rows
Lock Table …
Locking Issues
Starvation
T1 holds shared lock on Q
T2 requests exclusive lock on Q: blocks
T3, T4, ..., Tn request shared locks: granted
T2 is starved!
Solution?
Do not grant locks if other xction (with incompatible lock) is waiting
Locking Issues
No xction proceeds:
T1
T2
Deadlock
- T1 waits for T2 to unlock A
lock-X(B)
- T2 waits for T1 to unlock B
read(B)
After timeout, one of them is rolled back.
B B-50
write(B)
lock-S(A)
read(A)
Rollback transactions
Can be costly...
lock-S(B)
lock-X(A)
Locking Issues
Locking itself does not ensure serializability by itself:
T1
lock-X(B)
read(B)
B B-50
write(B)
unlock(B)
T2
lock-S(A)
read(A)
unlock(A)
lock-S(B)
read(B)
unlock(B)
display(A+B)
lock-X(A)
read(A)
A A + 50
write(A)
unlock(A)
T2 displays 50 less!!
Not same as
<T1, T2> or <T2, T1>
The Two-Phase Locking Protocol
This is a protocol which ensures conflict-serializable schedules.
Phase 1: Growing Phase
transaction may obtain locks
transaction may not release locks
Phase 2: Shrinking Phase
transaction may release locks
transaction may not obtain locks
The protocol assures serializability. It can be proved that the
transactions can be serialized in the order of their lock points
(i.e. the point where a transaction acquired its final lock).
2PL
Example: T1 in 2PL
Growing phase
Shrinking phase
T1
lock-X(B)
read(B)
B B - 50
write(B)
lock-X(A)
read(A)
Lock point
(final lock in txn)
A A - 50
write(A)
unlock(B)
unlock(A)
The order of the “lock points” of txns determines the serializability order.
2PL & Serializability
Recall: Precedence Graph
T1
T2
T3
read(Q)
write(Q)
read(R)
write(R)
read(S)
T1
T2
T3
2PL & Serializability
Recall: Precedence Graph
T1
T2
T3
read(Q)
write(Q)
read(R)
write(R)
read(S)
write(S)
T1
T2
T3
Cycle Non-serializable
2PL & Serializability
Relation between Growing & Shrinking phase:
T1G < T1S
T1
T2G < T2S
T2
T3G < T3S
T1 must release locks for other to proceed
T3
T1S < T2G
T2S < T3G
T3S < T1G
T1G < T1S< T2G <T2S<T3G<T3S<T1G
Not Possible under 2PL!
It can be generalized for any set of transactions...
2PL Issues
2PL does not prevent deadlock
T1
T2
lock-X(B)
read(B)
> 2 xctions involved?
- Rollbacks expensive
B B-50
write(B)
lock-S(A)
read(A)
lock-S(B)
lock-X(A)
2PL Issues: Cascading Rollbacks
T1
T2
T3
lock-X(A)
read(A)
lock-S(B)
read(B)
write(A)
unlock(A)
lock-X(A)
read(A)
write(A)
unlock(A)
lock-S(A)
read(A)
<xction fails>
T2, T3 need to be rolled back because T1 failed
The Two-Phase Locking Protocol (Cont.)
Two-phase locking does not ensure freedom from
deadlocks,
cascading rollbacks
Cascading roll-back is possible under two-phase locking. To avoid this,
follow a modified protocol called strict two-phase locking. Here a
transaction must hold all its exclusive locks till it commits/aborts.
Rigorous two-phase locking is even stricter: here all locks are held
till commit/abort. In this protocol transactions can be serialized in the
order in which they commit.
2PL Variants
Strict two phase locking
Exclusive locks must be held until xction commits
Ensures data written by xction can’t be read by others
Prevents cascading rollbacks
Strict 2PL & No Cascading Rollbacks
T1
T2
T3
lock-X(A)
read(A)
lock-S(B)
read(B)
write(A)
unlock(A)
lock-X(A)
read(A)
write(A)
unlock(A)
Strict 2PL
Does not
Allow that
(need to
Unlock at
Commit time)
lock-S(A)
read(A)
<xction fails>
Strict 2PL
Ensures any data written by uncommited xction not
read by another
Strict 2PL would prevent T2 and T3 from reading A
T1 & T2 wouldn’t rollback if T1 does
2PL Variants
Strict 2PL
Only Exclusive locks are held till txn commits
Rigorous two-phase locking
Exclusive and shared locks too must be held until
xction commits
Order the txns commit is serializability order
Both variants often used in DB systems
Strict 2PL
Lock Conversions
Two-phase locking with lock conversions:
– First Phase:
can acquire a lock-S on item
can acquire a lock-X on item
can convert a lock-S to a lock-X (upgrade)
– Second Phase:
can release a lock-S
can release a lock-X
can convert a lock-X to a lock-S (downgrade)
This protocol assures serializability. But still relies on the
programmer to insert the various locking instructions.
Automatic Acquisition of Locks
A transaction Ti issues the standard read/write instruction,
without explicit locking calls.
The operation read(D) is processed as:
if Ti has a lock on D
then
read(D)
else begin
if necessary wait until no other
transaction has a lock-X on D
grant Ti a lock-S on D;
read(D)
end
Automatic Acquisition of Locks (Cont.)
write(D) is processed as:
if Ti has a lock-X on D
then
write(D)
else begin
if necessary wait until no other trans. has any lock on D,
if Ti has a lock-S on D
then
upgrade lock on D to lock-X
else
grant Ti a lock-X on D
write(D)
end;
All locks are released after commit or abort
Implementation of Locking
A lock manager can be implemented as a separate process to
which transactions send lock and unlock requests
The lock manager replies to a lock request by sending a lock
grant messages (or a message asking the transaction to roll
back, in case of a deadlock)
The requesting transaction waits until its request is answered
The lock manager maintains a data-structure called a lock
table to record granted locks and pending requests
The lock table is usually implemented as an in-memory hash
table indexed on the name of the data item being locked
Lock Table
Black rectangles indicate granted
locks, white ones indicate waiting
requests
Lock table also records the type of
lock granted or requested
New request is added to the end of
the queue of requests for the data
item, and granted if it is compatible
with all earlier locks
Unlock requests result in the
Granted
Waiting
request being deleted, and later
requests are checked to see if they
can now be granted
If transaction aborts, all waiting or
granted requests of the transaction
are deleted
lock manager may keep a list of
locks held by each transaction, to
implement this efficiently