Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
SQL-part 2CSCI-4380
Transactions• A transaction is a series of database operations
executed as a logical unit.
• Example: Withdraw 100 dollars from account X: • Read account value of X into memory• If greater than 100 then
• subtract 100 from X• write X back to disk• commit
• else abort.
Transactions• Example: Transfer 100 dollars from account X to
account Y:
• Read account value of X into memory• If greater than 100 then
• subtract 100 from X• write X back to disk• read account value of Y into memory• add 100 to Y• write Y back to disk • commit
• else abort.
Concurrency• Multiple transactions executing at the same
time may have bad effects on each other.
T1 T2
r(x)x++
r(x)x--
w(x)r(y)
w(x)y--
w(Y)
Time
x=10, y=10 to start
x=9, y=9 at the end
Concurrency• Different execution orders changes the result
of the operation. Which one is correct?
T1 T2
r(x)x++w(x)
r(x)x--
r(y)w(x)
y--w(Y)
Time
x=10, y=10 to start
x=10, y=9 to start
Concurrency• Isolation says that if one transaction executes
completely before the other, than its result is acceptable.
T1 T2
r(x)x++w(x)r(y)y--
w(Y)r(x)x--
w(x)
T1 T2
r(x)x--
w(x)r(x)x++w(x)r(y)y--
w(Y)
x=10, y=10 to start
x=10, y=9 to start
in both cases
Serializability
• Make sure that even though operations of different transactions may be interleaved, the resulting state is equivalent to the result of some serial execution.
Atomicity• A transaction, i.e. all operations in a transaction
are either executed completely or it has no effect on the database.
• Define a transaction start point with START TRANSACTION
• A transaction either ends successfully with a COMMIT or aborted completely with a ROLLBACK.
Dirty read• Dirty read is a value written by
an uncommitted transaction
• T2 must not be allowed to commit before T1 commits
• If T1 aborts, then T2 must also be aborted (cascading rollbacks)
T1 T2
r(x)x++w(x)
r(x)x--
r(y)w(x)
y--w(Y)abort
Dirty read
Levels of isolation
• A transaction may define a level of isolation, how critical it is that the data it reads is correct.
• SET TRANSACTION READ ONLY• allows transactions to read dirty values.
This is the least restrictive level.
Levels of isolation• SET TRANSACTION READ WRITE• Does not allows transactions to read dirty values. This is the
least restrictive level.
• SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
• Does not allow dirty reads. All read values must be committed.
• It is possible for a value to be modified by committed transactions more than once, resulting in different reads.
Levels of isolation• SET TRANSACTION ISOLATION LEVEL REPEATABLE
READ;
• Does not allow dirty reads. All read values must be committed. Different reads will produce the same result (i.e. no one will change a read value while the transaction is processing.
• It is possible for newly inserted tuples to be relevant to a transaction in process. To disallow such “phantom updates”, one must use the most restrictive level of isolation:
• SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Foreign Keys• A foreign key is a referential integrity
constraint:
• R.A is a foreign key references S.B• means that• non-null values of R.A must be stored in
S.B
• S.B is a unique attribute or a primary key
FOREIGN KEYS• Example:
CREATE TABLE ABC (X int, Y int, PRIMARY KEY(X,Y)) ;
CREATE TABLE DEF (Z int, W int, Q int, PRIMARY KEY Z, FOREIGN KEY (Z,W) REFERENCES ABC(X,Y)) ;
If we try to delete/update a tuple ABC(1,2) and if there is a tuple in DEF that references this tuple, then the deletion will be rejected. If we try to update/insert a tuple DEF(1,2,3) and there is no corresponding tuple ABC(2,3), then the update/insert will be rejected.
MaintenanceCREATE TABLE DEF (
Z int, W int, Q int, PRIMARY KEY Z, FOREIGN KEY (Z,W) REFERENCES ABC(X,Y) ON DELETE CASCADE ON UPDATE SET NULL) ;
• When we delete a tuple from ABC, we can choose to delete all referencing tuples from DEF (called CASCADE) or set the referencing values to NULL (called SET NULL).
• When we update a tuple from ABC, we can cascade the update or set the tuples referencing the old value to NULL as well.
• All these events cascade and set null events become part of the same transaction as the triggering update/delete/insert.
Constraint checking• All constraints are checked immediately, i.e. as soon as
the relation they are attached to is changed (foreign keys are attached to the referenced relation).
• This is not desirable for cyclic constraints:• Example: check for egg a chicken exists and check
for chicken an egg exists
• Defer checking of constraints to the end of the transaction:
FOREIGN KEY (Z,W) REFERENCES ABC(X,Y)
DEFERRABLE INITIALLY DEFERRED
Other constraints
• NOT NULL: checks that the values stored for an attribute should not be null
• CHECK: checks for an attribute or tuple, the values satisfy a condition (anything that can be written in the WHERE clause of a query that refers to the appropriate attributes only)
Other constraints CREATE TABLE class (
id int PRIMARY KEY
, code CHAR(4)
, name VARCHAR(50) NOT NULL
, semester VARCHAR(5)
CHECK (semester in (‘Fall’, ‘Spring’,’Summer’)
, year INT
CHECK (year > 1990)
, CHECK (code in (SELECT name FROM departments)
or name = ‘MISC’)
) ;
Attribute based constraints
• The constraint:
• CHECK (code in (SELECT name FROM departments) or name = ‘MISC’)
• is checked when a new tuple is inserted into class or when it is updated.
• However, this is not checked when the departments relation is updated.
• If it was crucial to check it when departments is updated, then it must be declared as a foreign key.
Assertions• Integrity constraints can be expressed in SQL using
assertions.• CREATE ASSERTION assertionName CHECK ( … )
• Assertions are created for a database, i.e. for all tables in a schema. They are evaluated anytime a table in the schema is changed.
• The check clause of an assertion is similar to the WHERE clause, except there is no FROM clause and relations.
• Anytime a change (INSERT/UPDATE/DELETE) in a table violates an assertion, then the transaction causing the change is aborted.
Example Database• STUDENT(Id, Name, Password, Address)• FACULTY(Id, Name, DeptId, Password, Address)• COURSE(CrsCode, DeptId, CrsName, CreditHours)• REQUIRES(CrsCode, PrereqCrsCode,
EnforcedSince)• CLASS(CrsCode, SectionNo, Semester,
Year,Textbook, ClassTime, Enrollment, MaxEnrollment, ClassroomId, InstructorId)
• CLASSROOM(ClassroomId, Seats)• TRANSCRIPT(StudId, CrsCode, SectionNo,
Semester, Year, Grade)
Assertions• The max_enrollment for a class cannot be larger than
the seating capacity of the classroom assigned to the class.
CREATE ASSERTION maxClassSizeCHECK NOT EXISTS (SELECT * FROM CLASS C, CLASSROOM CR WHERE C.ClassroomId = CR.ClassroomId AND C.maxEnrollment >
CR.seats )
Assertions• Students cannot take a course without completing the prerequisites of
that course.
CREATE ASSERTION mustHavePrereqCHECK NOT EXISTS ( SELECT * FROM Transcript T1, Requires R WHERE T1.crscode=R.crscode AND NOT EXISTS ( SELECT * FROM Transcript T2 WHERE T2.crscode = R.crscode AND T2.studid=T1.studid AND T2.grade IN (ʻAʼ,ʼBʼ,ʼCʼ,ʼDʼ) ) )
Assertions• Students cannot register for more than one section of the same
course in the same semester.
CREATE ASSERTION no2SectionsCHECK NOT EXISTS ( SELECT * FROM Transcript T1, Transcript T2 WHERE T1.studid=T2.studid AND T1.year=T2.year AND T1.semester=T2.semester AND T1.crscode=T2.crscode AND T1.sectionNoT2.sectionNo )
Assertions• Students cannot take courses that meet at the same time.
CREATE ASSERTION noSameTimeRegistrationCHECK NOT EXISTS ( SELECT * FROM Transcript T1, Transcript T2, Class C1, Class C2 WHERE T1.studid=T2.studid AND T1.year=T2.year AND T1.semester=T2.semester AND C1.crscode=T1.crscode AND C1.semester=T1.semester AND C1.year=T1.year AND C1.sectionNo=T1.sectionNo AND C2.crscode=T2.crscode AND C2.semester=T2.semester AND C1.year=T1.year AND C1.sectionNo=T1.sectionNo AND C1.classtime = C2.classtime)
Assertions• A student cannot take the same course more than
three times.
CREATE ASSERTION atMostThreeTimesCHECK NOT EXISTS ( SELECT T.studid FROM Transcript T GROUP BY T.studid, T.crscode HAVING count(*) > 3)
Assertions
• All courses must be 3 or 4 credits.CREATE ASSERTION numCreditsCHECK 0 = (SELECT count(*) FROM Course C WHERE C.CreditHours NOT IN (3,4))
Triggers• A trigger has• a database event that must be true for the
trigger to be activated
• Example: insert of class• a condition that must be true for the
trigger to be executed
• Example: when the new tuple has code CSCI
Triggers
• A trigger has• a condition of how it is to be executed• for each row that is being changed
(inserted/updated/deleted)
• for each statement (for a given transaction)
Triggers• A trigger has
• a triggering time• BEFORE the triggering event makes
the updates
• AFTER the triggering event makes the updates
• INSTEAD OF the triggering event
Triggers
• A before trigger is executed before the triggering change is even executed (and recorded).
• An after trigger is executed after the triggering change is recorded.
• Triggers become part of the transaction that triggered them.
Triggers
• A trigger has• a statement body:• a procedure that contains possibly
multiple statements
Triggers
• For each update that changes a database, the tuple before and after the change can be accessed in a trigger
• OLD: the tuple before an update• NEW: the tuple after the update
• Inserts have no OLD, deletes have no NEW.
Trigger example• CREATE TRIGGER availableSpace• AFTER INSERT OF transcript• REFERENCING
• NEW ROW AS newt• FOR EACH ROW• WHEN (newt.grade is null)
• UPDATE Class SET maxenrollment = maxenrollment - 1 WHERE CrsCode = newt.crsCode and SectionNo = newt.sectionNo and Semester = newt.semester and Year = newt.year ;
Trigger example
• Postgresql syntax is a bit different for triggers. • Define first a function that returns a trigger, then define a
trigger.
Postgresql exampleCREATE OR REPLACE FUNCTION cleanName () RETURNS trigger AS '
BEGIN
IF(NEW.name = ''sibel'') THEN
UPDATE users SET name = ''adali'' where id = NEW.id ;
END IF;
RETURN NEW;
END;
' LANGUAGE plpgsql;
CREATE TRIGGER tafter AFTER INSERT OR UPDATE ON users
FOR EACH ROW EXECUTE PROCEDURE cleanName();
Postgresql exampleCREATE OR REPLACE FUNCTION cleanName () RETURNS trigger AS '
BEGIN
IF(NEW.name = ''sibel'') THEN
New.name = ''adali'' ;
END IF;
RETURN NEW;
END;
' LANGUAGE plpgsql;
CREATE TRIGGER tbefore BEFORE INSERT OR UPDATE ON users
FOR EACH ROW EXECUTE PROCEDURE cleanName();