16Thao Tác Trên Bảng Chuyến Tàu:

Một phần của tài liệu Hệ thống đặt vé xe lửa cho ga hòa hưng (Trang 48 - 76)

………

Commit tran

Set tran isolation level repeatable read Thêm,Cập nhật,Xóa

Commit tran

Cách giải quyết sử dụng phương thức khóa

Sử dụng khóa UPDLOCK cho chức năng xem tuyến để giải quyết triệt để các đụng độ.UPDLOCK tương ứng với mức cô lập của Repeatable read và serializable. Giải quyết tất cả các trường hợp đụng độ.

Hoạt động của các store procedure sau khi đã sửa lỗi

T1 ([]) T2 []

Begin Tran

Select * from TuyenTau with(UPDLOCK) where…

Commit tran

Begin tran ………….. Commit tran

6

11.1. Chức năng:

− Với cửa sổ trên có thể thực hiện Xem Chuyến Bất kỳ với việc Chọn Ga đi và Ga đến của Chuyến tàu đó, hoặc có thể chọn từ datagrid thông tin sẽ hiển thị lên cho bạn, Chức năng Xóa tuyến cho phép Xóa một tuyến bất kỳ được chọn . Chức năng reset sẽ đưa Cửa sổ lại trạng thái ban đầu.

11.2. Đụng độ :

TestCase13 Tên lỗi : không đọc lại được dữ liệu

Tình huống gây ra lỗi

Hai giao tác cùng thực hiện trên đơn vị dữ liệu là Chuyến: T1 liệt kê những thông tin của Chuyến, T2 cập nhật Chuyến trong cùng một thời điểm

Hoạt động của các store procedure trước khi sửa lỗi

T1 T2

begintran

set tran isolation level READ UNCOMMITTED

begintran

6 select*from chuyentau

where machuyen<5

waitfor delay '00:00:05' select*from chuyentau

where machuyen<5

commit

set tongghetrong = 0

where machuyen=1

commit

Cách giải quyết sử dụng mức cô lập

Chỉnh mức cô lập thành mức REPEATABLE READ (mức 3) cho giao tác T1, vì ở mức cô lập này sẽ giúp tránh được hiện tượng không đọc lại được dữ liệu khi xử lý đồng thời

Hoạt động của các store procedure sau khi đã sửa lỗi

T1 (isolation level REPEATABLE READ) T2

begintran

set tran isolation level REPEATABLE READ select*from chuyentau

where machuyen<5

waitfor delay '00:00:05' select*from chuyentau

where machuyen<5 commit begintran update chuyentau set tongghetrong = 0 where machuyen=1 commit Cách giải quyết sử dụng phương thức khóa

UPDLOCK,ReadPast. Khi đọc T1 cũng xin khóa không cho ai ghi – để tránh tình trạng dữ liệu khác nhau trong 2 lần đọc. Nên T2 phải chờ

Hoạt động của các store procedure sau khi đã sửa lỗi

T1 T2

begintran

select*from chuyentau

with(UPDLOCK,ReadPast) where machuyen<5

begintran

update chuyentau

set tongghetrong = 0

6 waitfor delay '00:00:05'

select*from chuyentau

where machuyen<5

commit

commit

Nhận xét Với mức cô lập 3 theo em là hợp lí nhất có thể, đã khắc phục được hiện tượng khác nhau giữa 2 lần đọc dữ liệu.

Áp dụng cách khóa đó theo em là hợp lí vì nó chỉ khóa dòng nó đang đọc đối với các lệnh ghi (update, delete) còn lại việc thao tác đọc chung dữ liệu hay thao tác ở dòng khác là được chấp nhận

TestCase14 Tên lỗi : Unrepeatable data

Tình huống gây ra lỗi

Khi một giao tác tiến hành hai thao tác đọc dữ liệu nhưng chưa commit, một giao tác khác chen ngang giữa hai thao tác đọc dữ liệu, thực hiện việc delete dữ liệu khiến xuất hiện lỗi Unrepeatable data

Hoạt động của các store procedure trước khi sửa lỗi

T1 ([Tên SP 1]) T2 [Tên SP 2]

begin tran

set tran isolation level READ UNCOMMITTED

select * from ChuyenTau where MaChuyen = @MaChuyen

waitfor delay '00:00:10'

select * from ChuyenTau where MaChuyen = @MaChuyen commit tran end Go exec sp_docthongtinchuyen 1 begin tran

set tran isolation level READ UNCOMMITTED

if exists(select MaChuyen from ChuyenTau where MaChuyen =@MaChuyen)

begin

-- Các bản cần xóa Hủy vé, Phiếu đặt chỗ, chi tiết phiếu đặt chỗ,Vé tàu,Thông tin ghế chuyến,Ga trung gian,Chuyến tàu.

if exists (select MaChuyen from PhieuDatCho where MaChuyen = @MaChuyen)

begin

delete from HuyVe

where MaDatCho in (select MaDatCho from PhieuDatCho Where MaChuyen = @MaChuyen)

6 delete from ChiTietDatCho where MaDatCho in (select MaDatCho from PhieuDatCho Where MaChuyen = @MaChuyen)

delete from PhieuDatCho where MaChuyen = @MaChuyen if @@error <> 0 begin rollback tran return end end

Delete from ThongTinGheChuyen where MaChuyen = @MaChuyen Delete from VeTau

where MaChuyen = @MaChuyen Delete from GaTrungGian where MaChuyen = @MaChuyen Delete from ChuyenTau

where MaChuyen = @MaChuyen if @@error <> 0 begin rollback tran return end end if(@@trancount >0)

6 commit tran end Go exec sp_xoachuyen 1 Cách giải quyết sử dụng mức cô lập

Sử dụng mức cô lập repeatable read, giữ share lock trên thao tác đọc dữ liệu cho đến hết giao tác, không cho cập nhật nếu không thỏa share lock , giải quyết được vấn đề unrepeatable data

Hoạt động của các store procedure sau khi đã sửa lỗi

T1 ([Tên SP 1]) T2 [Tên SP 2]

begin tran

set tran isolation level REPEATABLE READ --UNCOMMITTED

select * from ChuyenTau where MaChuyen = @MaChuyen

waitfor delay '00:00:10'

select * from ChuyenTau where MaChuyen = @MaChuyen commit tran end Go exec sp_docthongtinchuyen 1 begin tran

set tran isolation level READ UNCOMMITTED

if exists(select MaChuyen from ChuyenTau where MaChuyen =@MaChuyen)

begin

-- Các bản cần xóa Hủy vé, Phiếu đặt chỗ, chi tiết phiếu đặt chỗ,Vé tàu,Thông tin ghế chuyến,Ga trung gian,Chuyến tàu.

if exists (select MaChuyen from PhieuDatCho where MaChuyen = @MaChuyen)

begin

delete from HuyVe

where MaDatCho in (select MaDatCho from PhieuDatCho Where MaChuyen = @MaChuyen)

delete from ChiTietDatCho where MaDatCho in (select MaDatCho from PhieuDatCho Where MaChuyen = @MaChuyen)

delete from PhieuDatCho where MaChuyen =

6 @MaChuyen if @@error <> 0 begin rollback tran return end end

Delete from ThongTinGheChuyen where MaChuyen = @MaChuyen Delete from VeTau

where MaChuyen = @MaChuyen Delete from GaTrungGian where MaChuyen = @MaChuyen Delete from ChuyenTau

where MaChuyen = @MaChuyen if @@error <> 0 begin rollback tran return end end if(@@trancount >0) commit tran end Go exec sp_xoachuyen 1

6

TestCase15 Tên lỗi : mất dữ liệu cập nhật

Tình huống gây ra lỗi

Hai giao tác cùng thực hiện trên đơn vị dữ liệu là chuyến tàu: T1 thêm một dòng dữ liệu , T2 cập nhật chuyến tàu trong cùng một thời điểm,sau đó T1 đọc lại thì giá trị không khớp với dữ liệu đang có.

Hoạt động của các store procedure trước khi sửa lỗi

T1 T2

begintran

set tran isolation level READ UNCOMMITTED

insertinto chuyentau(Machuyen,TongSoGhe) values(-1,10000)

waitfor delay '00:00:05' select Machuyen,TongSoGhe

from chuyentau where Machuyen=-1 commit begintran update chuyentau set TongSoGhe=9 where Machuyen=-1 commit

Cách giải quyết sử dụng mức cô lập

Chỉnh mức cô lập thành mức REPEATABLE READ (mức 3) cho giao tác T1, vì ở mức cô lập này sẽ giúp tránh được hiện tượng lỗi trên

Hoạt động của các store procedure sau khi đã sửa lỗi

T1 (isolation level REPEATABLE READ) T2

begintran

set tran isolation level REPEATABLE READ insertinto chuyentau(Machuyen,TongSoGhe) values(-1,10000)

waitfor delay '00:00:05' select Machuyen,TongSoGhe

from chuyentau where Machuyen=-1 commit begintran update chuyentau set TongSoGhe=9 where Machuyen=-1 commit

6

Cách giải quyết sử dụng phương thức khóa

UPDLOCK. để tránh tình trạng đã nêu

Hoạt động của các store procedure sau khi đã sửa lỗi

T1 T2

begintran

insertinto chuyentau(Machuyen,TongSoGhe) values(-1,10000)

waitfor delay '00:00:05' select Machuyen,TongSoGhe

from chuyentau with(UPDLOCK) where Machuyen=-1 commit begintran update chuyentau set TongSoGhe=9 where Machuyen=-1 commit

Nhận xét Với mức cô lập 3 theo em là hợp lí nhất có thể, đã khắc phục được hiện tượng lost update.

Áp dụng cách khóa đó theo em là hợp lí vì nó chỉ khóa dòng nó đang đọc đối với các lệnh ghi (update, delete) còn lại việc thao tác đọc chung dữ liệu hay thao tác ở dòng khác là được chấp nhận.

TestCase16 Tên lỗi : dirty read

Tình huống gây ra lỗi

Khi một giao tác tiến hành hai thao tác đọc dữ liệu nhưng chưa commit, một giao tác khác chen ngang giữa hai thao tác đọc dữ liệu, thực hiện việc update dữ liệu khiến xuất hiện lỗi Unrepeatable data

Hoạt động của các store procedure trước khi sửa lỗi

T1 ([sp_docthongtinchuyen]) T2 [sp_xoachuyen]

begintran

settranisolationlevelREAD

UNCOMMITTED

select*from ChuyenTau where

MaChuyen = @MaChuyen

waitfor delay '00:00:10'

begintran

settranisolationlevelREAD UNCOMMITTED

ifexists(select MaChuyen from ChuyenTau

6 committran end Go exec sp_docthongtinchuyen 3 begin

-- Các bản cần xóa Hủy vé, Phiếu đặt chỗ, chi tiết phiếu đặt chỗ,Vé tàu,Thông tin ghế chuyến,Ga trung gian,Chuyến tàu.

ifexists(select MaChuyen from

PhieuDatCho where MaChuyen = @MaChuyen) begin

deletefrom HuyVe

where MaDatCho in(select

MaDatCho from PhieuDatCho Where MaChuyen =

@MaChuyen)

deletefrom ChiTietDatCho

where MaDatCho in(select

MaDatCho from PhieuDatCho Where MaChuyen =

@MaChuyen)

deletefrom PhieuDatCho

where MaChuyen = @MaChuyen if@@error<> 0 begin rollbacktran return end end

Deletefrom ThongTinGheChuyen

where MaChuyen = @MaChuyen

Deletefrom VeTau

where MaChuyen = @MaChuyen

Deletefrom GaTrungGian

where MaChuyen = @MaChuyen

Deletefrom ChuyenTau

6 if@@error<> 0 begin rollbacktran return end end if(@@trancount>0) committran end Go exec sp_xoachuyen 3 Cách giải quyết sử dụng mức cô lập

Sử dụng mức cô lập read committed, giữ share lock trên thao tác đọc dữ liệu cho đến hết giao tác, không cho cập nhật, giải quyết được vấn đề dirty read.

Hoạt động của các store procedure sau khi đã sửa lỗi

T1 ([sp_docthongtinchuyen]) T2 [sp_xoachuyen]

begintran

settranisolationlevelREAD

COMMITTED

select*from ChuyenTau where

MaChuyen = @MaChuyen waitfor delay '00:00:10' committran end Go exec sp_docthongtinchuyen 3 begintran

settranisolationlevelREAD UNCOMMITTED

ifexists(select MaChuyen from ChuyenTau

where MaChuyen =@MaChuyen) begin

-- Các bản cần xóa Hủy vé, Phiếu đặt chỗ, chi tiết phiếu đặt chỗ,Vé tàu,Thông tin ghế chuyến,Ga trung gian,Chuyến tàu.

ifexists(select MaChuyen from

PhieuDatCho where MaChuyen = @MaChuyen) begin

deletefrom HuyVe

where MaDatCho in(select

MaDatCho from PhieuDatCho Where MaChuyen =

6 deletefrom ChiTietDatCho

where MaDatCho in(select

MaDatCho from PhieuDatCho Where MaChuyen =

@MaChuyen)

deletefrom PhieuDatCho

where MaChuyen = @MaChuyen if@@error<> 0 begin rollbacktran return end end

Deletefrom ThongTinGheChuyen

where MaChuyen = @MaChuyen

Deletefrom VeTau

where MaChuyen = @MaChuyen

Deletefrom GaTrungGian

where MaChuyen = @MaChuyen

Deletefrom ChuyenTau

where MaChuyen = @MaChuyen

if@@error<> 0 begin rollbacktran return end end if(@@trancount>0) committran end

6 Go

exec sp_xoachuyen 3

TestCase17 Tên lỗi : bóng ma

Tình huống gây ra lỗi

Hai giao tác cùng thực hiện trên đơn vị dữ liệu là vé: T1 đọc lấy danh sách vé, T2 thêm/xóa một vé trong cùng một thời điểm.

Hoạt động của các store procedure trước khi sửa lỗi

T1 T2

begintran

set tran isolation level READ UNCOMMITTED

select*from vetau

waitfor delay '00:00:05' select*from vetau

commit

begintran

deletefrom vetau where mave=1

commit

Cách giải quyết sử dụng mức cô lập

Chỉnh mức cô lập thành mức SERIALIZABLE (mức 4) cho giao tác T1, vì ở mức cô lập này sẽ giúp tránh được hiện tượng Bóng Ma khi xử lý đồng thời. Khi đó, hai lần đọc ở T1 sẽ cho kết quả giống nhau.

Hoạt động của các store procedure sau khi đã sửa lỗi

T1 (isolation level SERIALIZABLE) T2

begintran

set tran isolation level SERIALIZABLE

select*from vetau

waitfor delay '00:00:05' select*from vetau

commit

begintran

deletefrom vetau where mave=1

commit

6

phương thức khóa tình trạng dữ liệu khác nhau trong 2 lần đọc. Nên T2 phải chờ

Hoạt động của các store procedure sau khi đã sửa lỗi

T1 T2

begintran

select*from vetau with(UPDLOCK) waitfor delay '00:00:05'

select*from vetau

commit

begintran

deletefrom vetau where mave=1

commit

Nhận xét Với mức cô lập 4 theo em là hợp lí nhất có thể, đã khắc phục được hiện tượng khác nhau giữa 2 lần đọc dữ liệu.

Áp dụng cách khóa đó theo em là hợp lí vì nó chỉ khóa dòng nó đang đọc đối với các lệnh ghi (update, delete) còn lại việc thao tác đọc chung dữ liệu hay thao tác ở dòng khác là được chấp nhận.

TestCase18 Tên lỗi : bóng ma

Tình huống gây ra lỗi

Hai giao tác cùng thực hiện trên đơn vị dữ liệu là chuyến tàu: T1 đọc lấy danh sách chuyến tàu, T2 thêm/xóa một chuyến tàu trong cùng một thời điểm.

Hoạt động của các store procedure trước khi sửa lỗi

T1 T2

begintran

set tran isolation level READ UNCOMMITTED

select*from chuyentau

waitfor delay '00:00:05' select*from chuyentau

commit

begintran

deletefrom chuyentau where machuyen=1

commit

Cách giải quyết sử dụng mức cô lập

Chỉnh mức cô lập thành mức SERIALIZABLE (mức 4) cho giao tác T1, vì ở mức cô lập này sẽ giúp tránh được hiện tượng Bóng Ma khi xử lý đồng thời. Khi đó, hai lần

6

đọc ở T1 sẽ cho kết quả giống nhau.

Hoạt động của các store procedure sau khi đã sửa lỗi

T1 (isolation level SERIALIZABLE) T2

begintran

set tran isolation level SERIALIZABLE

select*from chuyentau

waitfor delay '00:00:05' select*from chuyentau

commit

begintran

deletefrom chuyentau where machuyen=1

commit

Cách giải quyết sử dụng phương thức khóa

Updlock. Khi đọc T1 cũng xin khóa không cho ai ghi – để tránh tình trạng dữ liệu khác nhau trong 2 lần đọc. Nên T2 phải chờ

Hoạt động của các store procedure sau khi đã sửa lỗi

T1 T2

begintran

select*from chuyentau with(UPDLOCK) waitfor delay '00:00:05'

select*from chuyentau

commit

begintran

deletefrom chuyentau where machuyen=1

commit

Nhận xét Với mức cô lập 4 theo em là hợp lí nhất có thể, đã khắc phục được hiện tượng khác nhau giữa 2 lần đọc dữ liệu.

Áp dụng cách khóa đó theo em là hợp lí vì nó chỉ khóa dòng nó đang đọc đối với các lệnh ghi (update, delete) còn lại việc thao tác đọc chung dữ liệu hay thao tác ở dòng khác là được chấp nhận.

TestCase19 Tên lỗi : CONVERSION deadlock

Tình huống gây ra lỗi Hai giao tác cùng thực hiện trên đơn vị dữ liệu là chuyến tàu: T1 thêm một dòng dữ liệu , T2 cập nhật chuyến tàu trong cùng một thời điểm,sau đó T1 đọc lại, rồi T2 đọc lại.

6

Mà cả 2 đang ở mức cô lập 3 thì bị deadlock

Hoạt động của các store procedure trước khi sửa lỗi

T1(isolation level REPEATABLE READ) T2 (isolation level REPEATABLE

READ)

begintran

set tran isolation level REPEATABLE READ insertinto chuyentau(Machuyen,TongSoGhe) values(-1,10000)

waitfor delay '00:00:05' select Machuyen,TongSoGhe

from chuyentau

where Machuyen=-1

commit

begintran

set tran isolation level REPEATABLE READ update chuyentau

set tongghetrong = 0

where machuyen=1

waitfor delay '00:00:05' select Machuyen,TongSoGhe

from chuyentau

where Machuyen=-1

commit

Cách giải quyết sử dụng mức

cô lập Mức cố lập vẫn như củ nhưng thêm lệnh

with(readuncommitted) sau lệnh select như sau.

Hoạt động của các store procedure sau khi đã sửa lỗi

T1 (isolation level REPEATABLE READ) T2 (isolation level REPEATABLE

READ)

begintran

set tran isolation level REPEATABLE READ insertinto chuyentau(Machuyen,TongSoGhe) values(-1,10000)

waitfor delay '00:00:05' select Machuyen,TongSoGhe

from chuyentau

where Machuyen=-1

commit

begintran

set tran isolation level REPEATABLE READ update chuyentau

set tongghetrong = 0

where machuyen=1

waitfor delay '00:00:05' select Machuyen,TongSoGhe

from chuyentau

6 where Machuyen=-1

commit

Nhận xét Với mức cô lập 3 cộng với câu lệnh trên theo em là hợp lí nhất có thể, đã khắc phục được hiện tượng deadlock này.

6

17.1. Chức năng:

− Với cửa sổ này có thể thực hiện chức năng thêm Ga Bạn có thể nhập giá trị vào các text box.và chọn chức năng Thêm ga. Chọn Ga bất kỳ Thông tin sẽ hiển thị lên Text box và Thực hiện Xóa Ga TG.

17.2. Đụng độ:

TestCase20 Tên lỗi : Unrepeatable data

Tình huống gây ra lỗi

Khi một giao tác tiến hành hai thao tác đọc dữ liệu từ

GaTrungGian nhưng chưa commit, một giao tác khác chen ngang giữa hai thao tác đọc dữ liệu, thực hiện việc delete dữ liệu khiến xuất hiện lỗi Unrepeatable data

Hoạt động của các store procedure trước khi sửa lỗi

T1 ([Tên SP 1]) T2 [Tên SP 2]

6

set tran isolation level READ UNCOMMITTED --repeatable

select * from GaTrungGian where MaChuyen = @MaChuyen

waitfor delay '00:00:05' select * from GaTrungGian where MaChuyen = @MaChuyen

commit tran end

Go

exec sp_docgatrunggian_chuyen 3

set tran isolation level READ UNCOMMITTED

delete from GaTrungGian where MaChuyen =

@MaChuyen and MaGa = @MaGa commit tran end Go exec sp_xoagatrunggian_chuyen 3,222 Cách giải quyết sử dụng mức cô lập

Sử dụng mức cô lập repeatable read, giữ share lock trên thao tác đọc dữ liệu cho đến hết giao tác, không cho cập nhật nếu không thỏa share lock , giải quyết được vấn đề unrepeatable data

Hoạt động của các store procedure sau khi đã sửa lỗi

T1 ([Tên SP 1]) T2 [Tên SP 2]

begin tran

set tran isolation level REPEATABLE READ --COMMITTED --repeatable

select * from GaTrungGian where MaChuyen = @MaChuyen

waitfor delay '00:00:05' select * from GaTrungGian where MaChuyen = @MaChuyen

commit tran end

Go

exec sp_docgatrunggian_chuyen 3

begin tran

set tran isolation level READ UNCOMMITTED

delete from GaTrungGian where MaChuyen =

@MaChuyen and MaGa = @MaGa commit tran

end Go

exec sp_xoagatrunggian_chuyen 3,222

6

Tình huống gây ra lỗi

Khi một giao tác tiến hành hai thao tác đọc dữ liệu nhưng chưa commit, một giao tác khác chen ngang giữa hai thao tác đọc dữ liệu, thực hiện việc thêm dữ liệu khiến xuất hiện lỗi Unrepeatable data

Hoạt động của các store procedure trước khi sửa lỗi

T1 ([]) T2 []

begin tran

set tran isolation level READ UNCOMMITTED --repeatable

select * from GaTrungGian where MaChuyen = @MaChuyen

waitfor delay '00:00:05'

select * from GaTrungGian where MaChuyen = @MaChuyen commit tran end Go exec sp_docgatrunggian_chuyen 3 begin tran

set tran isolation level Repeatable READ --UNCOMMITTED insert into GaTrungGian(MaChuyen,MaGa,ThoiGianDen,ThoiGi anDi) values(@MaChuyen,@MaGa,@ThoiGianDen,@Thoi GianDi) if @@error <> 0 begin rollback tran return end

Một phần của tài liệu Hệ thống đặt vé xe lửa cho ga hòa hưng (Trang 48 - 76)

Tải bản đầy đủ (DOCX)

(76 trang)
w