………
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