15_05_baocao

126
 HQun Tr Cơ SDLiu 1 TRƢỜNG ĐẠI HC KHOA HC TỰ  NHIÊN KHOA CÔNG NGH THÔNG TIN B MÔN HTHNG THÔNG TIN HLTKNHUNG-01 Hthng MuaVoucher Mã nhóm: 15 SVTH:  Trn Duy Minh  1241081 Nguyn Phm Hoàng Anh – 1241003 Hunh Phƣơng Duy  1241017 TpHCM   2013.

Upload: duy-huynh

Post on 02-Mar-2016

18 views

Category:

Documents


0 download

TRANSCRIPT

 

 

Hệ Quản Trị Cơ SởDữ Liệu 1 

TRƢỜNG ĐẠI HỌC KHOA HỌC TỰ  NHIÊN 

KHOA CÔNG NGHỆ THÔNG TIN 

BỘ MÔN HỆ THỐNG THÔNG TIN 

HLTKNHUNG-01

Hệ thống MuaVoucher

Mã nhóm: 15 

SVTH:  Trần Duy Minh – 1241081

Nguyễn Phạm Hoàng Anh – 1241003

Huỳnh Phƣơng Duy – 1241017 

TpHCM – 2013.

 

 

Hệ Quản Trị Cơ SởDữ Liệu 2 

1  Phân công công việc

STT Công việc 1241081 1241003 1241017 % Hoànthành 

GV nhận

xét Cơ sở dữ liệu:

1 Usecase x 100

2 Mô hình ER  x 100

3 Mô hình hóa chức năng x 100

4 Thiết k ế CSDL x 100

5 Nhậ p liệu

 

x 100

6 Cài đặt Store Procedures x x x 100

7 Tìm kiếm các trườ ng hợ  p lỗi truy xuất đồngthờ i

x x x100

8 Cài đặt Transaction cho các trườ ng hợ  p lỗi

truy xuất đồng thờ ix x x

100

9 Giải quyết vấn đề lỗi truy xuất đồng thờ i

 

x x x 100

Giao diện: 10 Tìm kiếm template trang chủ x 100

11 Tìm kiếm template admin và doanh nghiệ p

 

x 100

12 Thiết k ế template trang chủ x 100

13 Thiết k ế template admin và doanh nghiệ p x 100

14 Tìm kiếm hình ảnh Voucher 

 

x 100

Admin:

15 Đăng nhậ p x 100

16 Đăng xuất x 100

17 Đổi mật khầu

 

x 100

18 Quản lí Voucher (xem danh sách voucher dang hoạt đông và ngừng hoạt động, cậ pnhật, xóa) 

x100

19 Quản lí Thẻ nạ p (xem danh sach thẻ chưanạp và thẻ đã đượ c nạ p,thêm, cậ p nhật tỉ lệ khuyến mãi) 

x100

20 Quản lí Doanh nghiệ p (Xem danh sáh hợ  pđồng và thêm hợp đồng)

x100

21 Quản lí Đơn hàng (Xem danh sách đã thanhtoán, đơn hàng trả sau và cậ p nhật tr ạng tháiđơn hàng trả sau)

x100

Doanh nghiệp: 22 Đăng nhậ p x 100

23 Đăng xuất x 100

24 Đổi mật khẩu x 100

25 Quản lí Voucher (thêm voucher, xem danhsách voucher dang hoạt động, ngừng hoạtđộng, cậ p nhật tỉ giá khuyến mãi) 

 

x100

26 Xem thông tin hợp đồng (hết hạn, còn thờ ihạn)

x100

Khách hàng: 27 Đăng ký 

 

x 100

28 Đăng nhậ p x 100

29 Đổi mật khẩu x 100

30 Xem thông tin cá nhân x 100

31 Voucher, xem chi tiết voucher x 100

32 Tìm kiếm (theo tên, giá) 

 

x 100

33 Xem giỏ hàng x 100

34 Thanh toán x 100

35 Xem lịch sử mua hàng x 100

 

 

Hệ Quản Trị Cơ SởDữ Liệu 3 

36 Nạ p thẻ x 100

37 Xem lịch sử nạ p thẻ x 100

2  Phần báo cáo:

STT Nội dung % Hoàn thành MSSV tham gia GV nhận xét 

Lần 1

 

1 Mô tả hệ thống 100 1241081

1241003

1241017 

Lần 2

2 Thiết k ế mô hình ER 

 

10012410811241003

1241017

3 Vẽ lượ c đồ cơ sở dữ liệu 10012410811241003

1241017

4 Các mối quan hệ trong lượ c đồ ER 100

1241081

1241003

1241017

5 Mô tả lược đồ cơ sở dữ liệu 100

1241081

12410031241017

6 Mô tả r àng buộc của cơ sở dữ liệu 100

1241081

12410031241017

Lần3 

7 Mô tả thủ tục của hệ thống

 

100

1241081

1241003

1241017

Lần 4

8Mô tả, cài đặt xử lý tình huống tranh

chấp đồng thời và Deadlock  

 

100

1241081

12410031241017

Lần 5 

9

Toàn bộ  báo cáo - Script CSDL

- Script tranh chấ p- Script Fix lỗi

- Ứ ng dụng demo- Quay phim demo

10012410811241003

1241017

3  Phần t ình huống truy xuất đồng thờ i

STT Nội dung % Hoàn thành MSSV tham gia GV nhận xét 

1Admin và Doanh Nghiệp cùng cậ p nhậtgiá khuyến mãi trên 1 sản phẩm tại 1

thời điểm.

10012410811241003

2 Hai khách hàng cùng mua 1 sản phẩm 100 1241017

 

 

Hệ Quản Trị Cơ SởDữ Liệu 4 

và cậ p nhật số lượ ng sản phẩm còn lại.

3

Admin cậ p nhật tỉ lệ khuyến mãi khônghợ  p lệ và bị hủy giao tác trong khi đókhách hàng nạ p thẻ có mệnh giá trùngvớ i mệnh giá admin cậ p nhật nên đãđọc dữ liệu rác của Admin.

100 1241017

4

Admin thực hiện cậ p nhật voucher (giáKM) nhưng không hợ  p lệ và bị hủygiao tác - khách hàng thanh toán và đọc

dữ liệu rác do admin cậ p nhật và lưuvào đơn hàng. 

100 1241003

5

Hai khách hàng cùng nạ p 1 thẻ nạ p tại

1 thời điểm => cả 2 đều nạp được vàthông tin khách hàng nạ p thẻ của kháchhàng đầu tiên bị mất

100 1241003

6

Khách hàng tìm kiếm 1 sản phẩm nằmtrong khoảng giá bất k ỳ, cùng lúcdoanh nghiệp thêm 1 sản phẩm mới cógiá nằm trong khoảng giá khách hàngtìm kiếm.

100 1241081

7

Khách hàng tìm kiếm sản phẩm theotên cùng lúc đó doanh nghiệp thêm 1voucher có tên chứa chuỗi tìm kiếm

của khách hàng. 

 

100 1241081

8

Doanh nghiệp xem danh sách các hợ  pđồng đã ký kết cùng lúc Admin thêmmớ i 1 hợp đồng ký kết vớ i doanh

nghiệp trên. 

100 1241081

9

Doanh nghiệp xem danh sách hợp đồnghết thờ i hạn, cùng lúc đó Admin kíchhoạt lại 1 hợp đồng hết hạn của doanhnghiệp trên. 

100 1241003

10

Khách hàng tìm kiếm sản phẩm nằm

trong khoảng giá bất kì cùng lúc đóadmin chỉnh sửa giá của 1 voucher nằm

trong khoảng giá mà khách hàng đangtìm. 

 

100 1241017

11

Hai khách hàng cùng nạ p thẻ tại cùng 1thời điềm, nhưng chỉ có một kháchhàng có tiền trong tài khoản, kháchhàng còn lại thì thông báo nạp thànhcông nhưng lại không có tiền trong tàikhoản.

100 1241017

4  Phần chức năng hệ thống

STT Nội dung % Hoàn thành MSSV tham gia GV nhận xét 1 Đăng nhậ p 100 1241017

2 Đăng ký 100 1241017

3 Xem chi tiết voucher 100 1241017

 

 

Hệ Quản Trị Cơ SởDữ Liệu 5 

4 Xem danh sách Deal hôm nay 100 1241017

5 Xem danh sách Deal gần đây 100 1241017

6 Tìm kiếm Voucher 100 1241017

7 Xem thông tin cá nhân 

 

100 1241017

8 Nạ p thẻ 100 1241017

9 Đổi mật khẩu 100

1241017(KH)

1241003(AD)1241081(DN)

10 Đăng xuất 100

1241017(KH)

1241003(AD)1241081(DN)

11 Xem lịch sử nạ p thẻ 100 1241017

12 Xem giỏ hàng 100 1241017

13 Thanh toán 100 1241017

14 Xem lịch sử mua hàng 100 1241017

15 Quản lí Voucher (thêm, xóa, sửa) 1001241003(AD)1241081(DN)

16 Quản lí Hợp đồng (thêm, sửa) 1001241003(AD)

1241081(DN)

17Quản lí Thẻ nạp (thêm, cậ p nhật tỉ lệ khuyến mãi) 

100 1241003(AD)

18 Quản lí Đơn hàng (cậ p nhật) 100 1241003(AD)

5  Phần nâng cao 

STT Nội dung % Hoàn thành MSSV tham gia GV nhận xét 1

2

 

 

Hệ Quản Trị Cơ SởDữ Liệu 6 

MỤC LỤC1 PHẠM VI HỆ THỐNG..................................................................................................................7

1.1  Giớ i thiệu .................................................................................................................................7

1.2   Phạm vi nghiệ p vụ ....................................................................................................................7

1.3  Qui định của hệ thố ng ...............................................................................................................7

2 MÔ TẢ CHỨC NĂNG HỆ THỐNG .............................................................................................9

2.1   Danh sách chức năng ...............................................................................................................9

2.2   Mô tả chi tiế t chức năng .........................................................................................................10

3 MÔ TẢ CƠ SỞ DỮ LIỆU............................................................................................................20

3.1   Lược đồ cơ sở d ữ liệu .............................................................................................................20

3.2   Mô tả cơ sở d ữ liệu .................................................................................................................20

3.3   Ràng buộc của cơ sở d ữ liệu ...................................................................................................35

4 MÔ TẢ TÌNH HUỐNG TRANH CHẤP ĐỒNG THỜ I..............................................................41

4.1   Mô tả thủ t ục của hệ thố ng ......................................................................................................46

4.2   Mô tả tình huố ng tranh chấp đồng thờ i ...................................................................................46

4.3   Mô tả giải pháp xử  lí ..............................................................................................................65

5 Ứ NG DỤNG DEMO.....................................................................................................................77

5.1   Mô tả cấu trúc ứ ng d ụng ....................................................................................................... 103

5.2  Tình huố ng tranh chấp đồng thờ i .......................................................................................... 105

5.3 Bộ dữ liệu test các tình huống ............................................................................................... 118

6 TỔNG K ẾT ................................................................................................................................ 126

 

 

Hệ Quản Trị Cơ SởDữ Liệu 7 

1  PHẠM VI HỆ THỐNG

1.1   Gi ớ i thi ệu 

Mục tiêu của hệ thống MuaVoucher là mang lại những sản phẩm và dịch vụ tuyệt

vờ i, giảm giá lên đến 90% cho các thành viên của MuaVoucher và cho cộng đồng tại

Thành phố Hồ Chí Minh. MuaVoucher chỉ  làm việc với các doanh nghiệ p lớn để 

đảm bảo r ằng những sản phẩm và dịch vụ  mà MuaVoucher cung cấp là rất tốt. Vì bạn,

MuaVoucher có thể cung cấ p những sản phẩm tuyệt vờ i với giá thật r ẻ.

1.2   Ph ạm vi nghi ệp v ụ 

- Các khách hàng được đăng kí tài khoản miễn phí trên hệ thống của MuaVoucher.

 Ngoài ra, còn đượ c cung cấ p các chức năng gần gũi dể sử dụng để có thể tự do lựa

chọn các voucher yêu thích 

- Hộ tr ợ  thanh toán trả trướ c qua hệ thống nạ p thẻ Voucher giúp khách hàng năng động

hơn trong việc thanh toán.

- Để đảm bảo chất lượ ng sản phẩm , MuaVoucher chỉ sẽ kí hợp đồng vớ i doanh nghiệ p

lớn và quản lý doanh nghiệ p chặt chẽ , đồng thờ i cung cấ p cho doanh nghiệ p chức

năng quản lý những Voucher sản phẩm của chính mình cung cấp để linh hoạt hơn

trong khâu quản lý 

1.3   Qui đị nh c ủa h ệ th ố ng 

- Khách hàng và doanh nghiệ p phải đăng nhậ p vào hệ thống mới có thể sử dụng các

chức năng nằm trong phạm vi của mình 

- Các thông tin cá nhân của khách hàng và doanh nghiệ p phải đúng sự thật , nếu không

mọi mất mát về  phía khách hàng MuaVoucher sẽ không chịu trách nhiệm

- Để thanh toán trả trướ c , số dư trong tài khoản khách hàng phải lớn hơn tổng số tiền

thanh toán trong giỏ hàng 

- Khi muốn hủy khách hàng phải gọi tr ực tiếp lên MuaVoucher để thông báo hủy

- Khách hàng nên kiểm tra giỏ hàng kĩ lưỡng trước khi thanh toán , mọi thiếu sót đơn

hàng do sơ suất phía khách hàng MuaVoucher sẽ không giải quyết

- Doanh nghiệ p khi muốn đăng quảng cáo sản phẩm thì phải lên trực tiếp công ty

MuaVoucher để ký hợp đồng và đăng kí thông tin doanh nghiệ p

 

 

Hệ Quản Trị Cơ SởDữ Liệu 8 

- Sau khi hợp đồng được xét duyệt ,mỗi doanh nghiệ p sẽ có 1 tài khoản duy nhất do

MuaVoucher cung cấ p

- Mọi thông tin sản phẩm được đăng phải đượ c qua kiểm định sự thật, nếu có sai sót gì

về  phía doanh nghiệp thì mọi đền bù phía doanh nghiệ p sẽ phải chịu trách nhiệm theo

như hợp đồng đã nêu.

 

 

Hệ Quản Trị Cơ SởDữ Liệu 9 

2  MÔ TẢ CHỨC NĂNG HỆ THỐNG

2.1    Danh sách chức năng : 

uc Primary Use Cases

Người dùng

Khách Hàng

Admin

Doanh Nghiệp

 Đăng nhập

Thay đổi thông tin cánhân

Quản lý Voucher 

Quản lý thẻ nạp

Quản lý đơn hàng

 Đăng ký

Nạp thẻ

Thay đổi mật khẩu

Xem lịch sử nạp thẻ

Thanh toán

Xem lịch sử muahàng

Mua Voucher 

Xem thông tinVoucher 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 10 

2.2  

 Mô tả chi ti ế t ch ức năng  

Chức năng Đăng Ký: 

o  Mục tiêu: khách hàng nếu muốn mua voucher trên MuaVoucher phải đăng

ký trở  thành thành viên của MuaVoucher. 

o  Người dùng: Khách hàng (ngày sinh của của khách hàng không đượ c

trướ c 01/01/1900 và sau ngày hiện tại) 

o  Đầu vào:

  Tên đăng nhậ p: mỗi khách hàng có một tên riêng khi đăng nhập vào

hệ thống.

  Password (mật khẩu): có độ dài từ 6 ký tự tr ở  lên có phân biệt chữ 

hoa, chữ thường, các ký tự đặc biệt để tăng tính bảo mật. 

   Nhậ p lại Password: xác định xem khách hàng đã thật sự nhập đúng

 password đã đặt trước đó chưa. Tránh tình trạng khách hàng sau khi

đăng ký xong lại quên password.

  Họ và tên: khách hàng nên nhập đúng tên trong CMND .

   Ngày sinh: hệ thống sẽ kiểm tra ngày sinh của khách hàng,ngày sinh

của của khách hàng không được trướ c 01/01/1900 và sau ngày hiện

tại 

  Giới tính 

  Chứng minh nhân dân (CMND) 

  Điện thoại: khách hàng nên nhập chính xác số điện thoại của mình

nếu bạn có ý muốn mua hàng trên MuaVoucher, trong trườ ng hợ  p hệ 

thống không gửi mail xác thật đơn hàng đượ c.

  Email: khách hàng nhập đúng địa chỉ email của mình để hệ thống có

thể gửi mail xác nhận đơn hàng cũng như cậ p nhập các Voucher mớ i

cho khách hàng khi trở  thành thành viên.

o  Đầu ra: Hiển thị thông báo Đăng Ký thành công cho phép người dùng

đăng nhập vào hệ thống.

 

 

Hệ Quản Trị Cơ SởDữ Liệu 11 

o  Các bướ c thực thi:

  Bướ c 1:  Người dùng vào trang chủ của MuaVoucher 

  Bướ c 2: Người dùng chọn chức năng Đăng Ký (nếu người dùng

chưa có tài khoản trong mua voucher)

  Bướ c 3: Trang dangky.aspx hiện ra, tại đây người dùng sẽ nhập các

thông tin mà MuaVoucher đề ra cho bạn. Ngườ i dùng đọc những nội

quy khi tham gia vào MuaVoucher nếu bạn chấ p nhận thìđánh dấu

vào ô vuông trướ c nội quy và tiế p tục , nếu không chấ p nhận ngườ i

dùng có thể tr ở về trang chủ đề xem các sản phẩm.

  Bước 4: Sau khi điền đầy đủ các thông tin và chấ p nhận nội quy của

MuaVoucher, người dùng nhấp vào nút Đăng Ký và chờ  hệ thống

xác nhận.

  Bước 5: Khi người dùng nhận được câu: “Bạn đã đăng ký thành

công. Chào mừng tendangnhap đến với MuaVoucher!!!”, ngườ i

dùng đã có tài khoản trong MuaVoucher. Người dùng có thể xem

sản phẩm và mua voucher trên MuaVoucher và được hưở ng quyền

lợi khi là thành viên của MuaVoucher.

  Bướ c 6: K ết thúc chức năng Đăng Ký. 

 Chức năng Đăng Nhập: 

o  Mục tiêu: Khi đăng nhập người dùng có thể mua các Voucher có trên

MuaVoucher và các quyền lợ i khi mua.

o  Người dùng: Khách hàng (sau khi đăng ký thành công và có tài khoản trên

MuaVoucher), Admin, Doanh Nghiệ p.

o  Đầu vào:

  Tên đăng nhậ p

  Password (Mật khẩu)

(Mỗi người dùng đều có một tên đăng nhậ p và mật khẩu riêng đượ c sử sụng trong

MuaVoucher)

 

 

Hệ Quản Trị Cơ SởDữ Liệu 12 

o  Đầu ra: Đăng nhập thành công quay về trang chủ.

o  Các bướ c thực thi:

  Bước 1: Người dùng vào trang chủ của MuaVoucher.

  Bướ c 2: Ngườ i dùnglựa chọn chức năng Đăng Nhậ p (nếu ngườ i

dùng đã có tài khoản trong MuaVoucher), Đăng Ký (nếu người dùng

chưa có tài khoản trong mua voucher). Ở đây, bạn sẽ chọn là Đăng

 Nhậ p.

  Bướ c 3: Trang dangnhap.axps hiện ra, tại đây người dùng nhập tên

người dùng, mật khẩu.

  Bước 4: Người dùng chọn nút Đăng Nhậ p, hệ thống sẽ kiểm tra tên

đăng nhập và mật khẩu của bạn. Nếu đúng trang chủ của

MuaVoucher và bên góc phải màn sẽ hiện câu: "Xin chào

tendangnhap !!!". Nếu sai hệ thống sẽ thông báo lỗi ngay tại chỗ bạn

nhập sai, Bướ c 3 sẽ lặ p lại cho bạn nhậ p lại thông tin. 

  Bướ c 5: K ết thúc chức năng Đăng Nhậ p.

 Chứ c năng Thay Đổi Mật Khẩu:

o  Mục tiêu: Người dùng sửa mật khẩu trên hệ thống.

o  Người dùng: Khách hàng, Admin, Doanh Nghiệ p.

o  Đầu vào: Người dùng đăng nhập vào hệ thống, xem thông tin cá nhân và

chọn chức năng thay đổi mật khẩu.

o  Đầu ra: Thông báo thay đổi mật khẩu thành công. 

o  Các bướ c thực thi:

  Bướ c 1: Hiển thị thông tin người dùng. 

  Bước 2: Người dùng chọn chức năng thay đổi mật khẩu.

  Hiện From thay đổi mật khẩu.

   Người dùng nhậ p:

- Mật khẩu mớ i.

 

 

Hệ Quản Trị Cơ SởDữ Liệu 13 

- Mật khẩu mớ i nhậ p lại.

  Hệ thống kiểm tra mật khẩu thay đổi:

-  Nếu mật khẩu mớ i nhậ p lại sai thì hiện thông báo lỗi:

 Mật khẩu mớ i nhậ p lại không chính xác. 

  Xóa mật khẩu mới và mật khẩu mớ i nhậ p lại. Quay về Bướ c 2.

   Nếu các thông tin đều nhập đúng tiế p tục Bướ c 3.

  Bướ c 3: Hệ thống cậ p nhật mật khẩu đã thay đổi và hiển thị thông

 báo thay đổi mật khẩu thành công cho người dùng. 

  Bướ c 4: Quay tr ở về Bướ c 1.

 Chức năng Thay Đổi Thông Tin Cá nhân: 

o  Mục tiêu: Người dùng sửa thông tin cá nhân trên hệ thống.

o  Người dùng: Khách hàng.

o  Đầu vào: khách hàng đăng nhập vào hệ thống, xem thông tin cá nhân. 

o  Đầu ra: Thông báo thay đổi thông tin cá nhân thành công. 

o  Các bướ c thực thi:

  Bướ c 1: Hiển thị thông tin khách hàng.

  Bướ c 2: Khách hàng thay đổi các thông tin như: 

  Họ và tên. 

   Ngày sinh. 

  Giới tính. 

  Địa chỉ.

  Số điện thoại.

  Email.

  Hệ thống kiểm tra thông tin thay đổi có hợ  p lệ:

-  Nếu các thông tin thay đổi không đúng định dạng thì

hiện thông báo lỗi.

- Quay về  bướ c 1.

 

 

Hệ Quản Trị Cơ SởDữ Liệu 14 

   Nếu các thông tin đều nhập đúng tiế p tục Bướ c 3.

  Bướ c 3: Hệ thống cậ p nhật thông tin khách hàng đã thay đổi và hiện

thị thông báo thay đổi thông tin thành công cho người dùng. 

  Bướ c 4: Quay tr ở về Bướ c 1.

 Chức năng mua Voucher:

o  Mục tiêu: giúp cho khách hàng đặt mua Voucher nếu tìm đượ c Voucher 

ưng ý. 

o  Người dùng: Khách hàng 

o  Đầu vào: Yêu cầu k hách hàng phải đăng nhập thanh công vào hệ thống và

chọn chức năng Đặt Mua.

o  Đầu ra: Voucher đượ c bỏ vào Giỏ hàng của k hách hàng.

o  Các bướ c thực thi:

  Bướ c 1: Hiện danh sách Voucher.

  Bướ c 2: Chọn Voucher ưng ý. 

  Bướ c 3: Nhậ p số lượ ng Voucher cần mua.

  Bướ c 4: Hệ thống kiểm tra số lượ ng của Voucher đó. 

  Trườ ng hợ  p nếu số lượ ng voucher nhiều hơn số lượ ng voucher 

có trong hệ thống:

- Thông báo lỗi.

- Quay lại Bướ c 3.

  Trườ ng hợ  p nếu số lượng voucher ít hơn số lượng voucher có

trong hệ thống, tiế p tục Bướ c 5.

  Bước 5: Voucher đặt mua đượ c thêm vào Giỏ Hàng của k hách hàng.

 Chức năng Thanh toán: 

o  Mục tiêu: Khách hàng thanh toán Voucher trên hệ thống.

o  Người dùng: Khách hàng. 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 15 

o  Đầu vào: Khách hàng đăng nhập vào hệ thống, vào xem Giỏ Hàng và chọn

chức năng thanh toán. 

o  Đầu ra: Thanh toán thành công. 

o  Các bướ c thực thi:

  Bướ c 1: Hiển thị danh sách các Voucher có trong Giỏ Hàng. 

  Bướ c 2: Kiểm tra Giỏ Hàng 

  Trườ ng hợp khách hàng chưa có Voucher trong Giỏ hàng mà

chọn chức năng Thanh toán thì: 

- Thông báo lỗi.

- Quay về Bướ c 1.

  Trườ ng hợp khách hàng muốn thay đổi Voucher trướ c khi

thanh toán như thay đổi số lượ ng hoặc xóa Voucher đó ra khỏi

giỏhàng.Giỏ hàng đượ c hệ thống cậ p nhật lại.Tiế p tục Bướ c 3.

  Trườ ng hợp khách hàng thanh toán hết Voucher trong giỏ 

hàng thì chọn nút thanh toán và tiế p tục Bướ c 3.

  Bước 3: Thanh toán ( có hai hình thức thanh toán : trả trước và trả 

sau)

  Hiện thị textbox Nhập vào địa chỉ giao hàng. 

   Nếu khách hàng chọn hình thức là: Trả trướ c

- Hệ thống kiểm tra số dư trong tài khoản của khách hàng:

  Nếu tổng số tiền khi khách hàng thanh toán nhỏ 

hơn số dư tài khoản của khách hàng. Nếu thỏa thì

việc mua sản phẩm đượ c chấ p nhận, đồng thờ i hệ 

thống sẽ tr ừ số tiền trong thẻ Voucher của thành

viên bằng số tiền mua sản phẩm.Tiế p tục Bướ c 4.

  Nếu tổng số tiền khi khách hàng mua sản phẩm

lớn hơn số dư tài khoản của khách hàng: 

a.  Thông báo lỗi.

 

 

Hệ Quản Trị Cơ SởDữ Liệu 16 

 b.  Quay về Bướ c 1.

   Nếu khách hàng chọn hình thức là: Trả sau

- Tiế p tục Bướ c 4.

  Bướ c 4: Hiện thị thông báo Thanh toán thành công. 

  Bướ c 5: Quản tr ị viên sẽ gửi mail đến khách hàng mã số hóa đơn

giao hàng và thờ i gian giao phiếu.

 Chức năng Xem Lịch Sử  Mua Hàng:

o  Mục tiêu : Người dùng xem lại lịch sử mua hàng trước đó. 

o  Người dùng: Khách hàng. 

o  Đầu vào: Khách hàng phải đăng nhập vào hệt thống và chọn chức năng

Xem lịch sử mua hàng. 

o  Đầu ra: Xem lịch sử mua hàng thành công. 

o  Các bướ c thực thi:

  Bướ c 1:Chọn chức năng xem lịch sử mua hàng

  Bướ c 2 Hiển thị màn hình xem lịch sử mua hàng. 

  Bướ c 3: Người dùng chọn xem chi tiết của một đơn hàng. 

  Bướ c 4: Quay về Bướ c 1 nếu khách hàng muốn xem tiếp đơn hàng

hoặc không thì kết thúc xem lịch sử mua hàng. 

 Chức năng Xem Thông tin Voucher:

o  Mục tiêu: Khách hàng có thể xem chi tiết của Voucher như giá gốc, giá

khuyến mãi, thông tin về Voucher đó…… 

o  Người dùng: Khách hàng. 

o  Đầu vào: Khách hàng đã đăng nhậ p hệ thống và khách hàng chưacó tài

khoản trong hệ thống, chọn xem chi tiết Voucher.

o  Đầu ra: Hiển thị màn hình chi tiết Voucher.

o  Các bướ c thực thi:

 

 

Hệ Quản Trị Cơ SởDữ Liệu 17 

  Bướ c 1: Hiện danh sách các Voucher 

  Bướ c 2 : Nhấn nút xem chi tiết Voucher cần xem

  Bướ c 3: Hiền thị màn hình xem thông tin chi tiết Voucher.

  Bướ c 4: Khách hàng xem thông tin Voucher.

 Chức năng Nạp thẻ: 

o  Mục tiêu: Người dùng nạ p thẻ vào tài khoản.

o  Người dùng: Khách Hàng. 

o  Đầu vào: Khách hàng đã đăng nhập vào hệ thống và chọn chức năng nạ p

thẻ.

o  Đầu ra: Nạ p thẻ thành công. 

o  Các bướ c thực thi:

  Bướ c 1: Chọn chức năng nạ p thẻ 

  Bướ c 2: Hiển thị màn hình nạ p thẻ.

  Bướ c 3: Người dùng nhập vào: số Series và Code thẻ.

  Bướ c 4: Hệ thống kiểm tra thẻ nạ p:

  Trườ ng hợ  p số Series và Code không hợ  p lệ:

- Thông báo lỗi.

- Xóa số Series và Code thẻ đã nhậ p.

- Quay về Bướ c 1.

  Trườ ng hợ  p số Series và Code hợ  p lệ. Tiế p tục Bướ c 5.

  Bướ c 5: Thông báo nạ p thẻ thành công và hệ thống cậ p nhậ p lại số 

dư tài khoản của khách hàng. 

 Chức năng Xem Lịch Sử Nạp thẻ:

o  Mục tiêu: Khách hàng xem số dư tài khoản.

o  Người dùng: Khách hàng.

 

 

Hệ Quản Trị Cơ SởDữ Liệu 18 

o  Đầu vào: Khách hàng đã đăng nhập vào hệ thống và chọn chức năng Xem

lịch sử thẻ nạ p.

o  Đầu ra: Xem lịch sử thẻ nạp thành công. 

o  Các bướ c thực thi:

  Bướ c 1: Chọn chức năng xem lịch sử thẻ nạ p

  Bướ c 2: Hiển thị màn hình xem lịch sử nạ p thẻ.

  Bướ c 3: Khách hàng xem số dư tài khoản, ngày nạ p thẻ gần đây và

thông tin các thẻ đã nạ p

  Bướ c 4: K ết thúc xem lịch sử nạ p thẻ và quay về trang chủ.

 Chức năng Quản Lý Voucher:

o  Mục tiêu: Admin và Doanh Nghiệ pxem danh sách Voucher.

o   Người dùng: Admin và Doanh Nghiệ p

o  Đầu vào:Adminvà Doanh Nghiệ pđăng nhập thành công vào hệ thống và chọn

chức năng quản lí Voucher.

o  Đầu ra: Xem danh sách Voucher thành công. 

o  Các bướ c thực hiện:

  Bướ c 1: Chọn chức năng quản lý Voucher 

  Bướ c 2: Hiển thị danh sách Voucher. 

  Bướ c 3: Admin hoặc Doanh Nghiệp xem Voucher đượ c quyền cậ p

nhậttên Voucher, thông tin chi tiết, ngày bắt đầu, ngày kết thúc, giá gốc,

gái khuyến mãi, số lượng, hình ảnh của Voucher.

  Bước 4 : Sao lưu nếu các cậ p nhật hợ  p lệ .Nếu không hợ  p lệ quay lại

 bướ c 3

  Bướ c 5: K ết thúcvà quay về Bướ c 1.

 Chức năng Quản Lý Thẻ Nạp:

o  Mục tiêu: Admin xem danh sách thẻ nạ p.

o   Người dùng: Admin.

 

 

Hệ Quản Trị Cơ SởDữ Liệu 19 

o  Đầu vào:Adminđăng nhập thành công vào hệ thống và chọn chức năng quản lí

Thẻ nạ p.

o  Đầu ra: Xem danh sách thẻ nạ p thành công.

o  Các bướ c thực hiện:

  Bướ c 1: Chọn chức năng quản lý thẻ nạ p

  Bướ c 2: Hiển thị danh sách thẻ nạ p.

  Bướ c 3: Admin xem thẻ nạ p và thêm thẻnạ phoặc sửa đổi tý lệ khuyến

mãi. 

  Bước 4 :Sao lưu nếu các thông tin hợ  p lệ .Nếu không hợ  p lệ quay lại

 bướ c 3

  Bướ c 5: K ết thúcvà quay về Bướ c 1.

 Chức năng Quản Lý Đơ n Hàng:

o  Mục tiêu: Admin xem danh sách đơ n hàng.

o   Người dùng: Admin.

o  Đầu vào:Admin đăng nhập thành công vào hệ thống và chọn chức năng quản lí

đơ n hàng.

o  Đầu ra: Xem danh sách đơ n hàng thành công.

o  Các bướ c thực hiện:

  Bướ c 1: Chọn chức năng quản lý đơn hàng 

  Bướ c 2: Hiển thị danh sách đơ n hàng.

  Bướ c 3: Admin xem đơn hàng và cậ p nhật lại trang thái đơn hàng 

  Bước 4:Sao lưu nếu các thông tin hợ  p lệ .Nếu không hợ  p lệ quay lại bướ c

3

  Bướ c 5: K ết thúc và quay về Bướ c 1. 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 20 

3  MÔ TẢ CƠ SỞ DỮ LIỆU

3.1    Lược đồ cơ sở d ữ l i ệu 

 Mô hình quan hệ:

Loại hình dịch vụ Voucherthuộc

Doanh nghiệp

cung cấp

Người dùng

Khách hàngHợp đồng có

Thẻ nạp

nạp

Chi tiết

đơn hàng

Đơn hàng

Loại hình thanh

toán

thuộc thuộc

thuộc(1,1)

(1,n)(1,1)

(1,1)

(1,1)

(1,n)

(1,1)

(1,1)(1,1)

(0, n)

(1,1)

(0, n)

(0, n)

(1, n)

thanh toán

(0, n)

(1,1)Mã loại hình

Tên loại hình

Trạng thái

Mã hợp đồng

 Ngày ký

Thời hạn

Trạng thái

 Ngày thành lập

Mã thẻ

Series

Code thẻ

Mệnh giá

 Ngày nạp

CMND

 Ngày sinh

Giới tính

 Ngày

Tháng

 Năm

Mã loại hình thanhtoán

Tên loại hình thanhtoán

Số lượng

Mã ĐH Địa chỉ giao hàngTổng tiền

 Ngày giao

Tình trạng

Mã ND

Tên đăng nhập

Mật khẩu

Họ và tên

Email

Địa chỉ

Đường QuậnThành phố

Số điện thoại

Trạng thái

Mã voucherTên voucher

 Ngày bắt đầu

 Ngày kết thúcGiá khuyến mãi

Số lượng

Giá gốc

Thông tin chi tiết

Trạng thái

Admin

Thành tiền

Trạng thái

Tài khoản thẻ nạp

Mã tài khoản

(1,1)

Số dư tài khoản

Trạng thái

(0,n)

 Ngày đặt hàng

Trạng thái

Tỉ lệ khuyến mãi

(1, n)

Url hình

Mô tả

 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 21 

 Lƣợc đồ cơ sở dữ liệu:

3.2   Mô tả cơ sở d ữ l i ệu:  

a.  Các mối quan hệ trong lƣợc đồ ER: 

1.  Loại hình dịch vụ - Voucher:

 

Loại hình dịch vụ Voucherthuộc(1,1)(0, n)

 

- Vớ i mỗi loại hình dịch vụ có thể có nhiều hoặc không có Voucher nào thuộc loại đó. 

- Mỗi Voucher chỉ thuộc duy nhất một loại hình dịch vụ .

 

 

Hệ Quản Trị Cơ SởDữ Liệu 22 

2.  Voucher  – Doanh nghiệ p:

Voucher Doanh nghiệpcung cấp(1,1) (0, n)

 

- Doanh nghiệp có thể cung cấ p nhiều Voucher hoặc không cung cấp Voucher nào. 

- Một Voucher chỉ thuộc duy nhất một doanh nghiệ p.

3.  Doanh nghiệ p - Hợp đồng:

Doanh nghiệpHợp đồng có(1,n)(1,1)

 

- Mỗi doanh nghiệ p có một hoặc nhiều hợp đồng vớ i mua vocher.

- Một hợp đồng của duy nhất một doanh nghiệ p.

4.  Khách hàng –  Tài khoản:

Khách hàng Tài khoản thẻ nạpcó(1,n) (1, 1)

 

- Khách hàng có thể có một hoặc nhiều tài khoản thanh toán. 

- Một tài khoản là của duy nhất một khách hàng. 

5.  Tài khoản - Thẻ nạ p:

Tài khoản thẻ nạp Thẻ nạpnạp(0,n) (1, 1)

 

- Một thẻ nạp đượ c duy nhất một toàn khoản dùng. 

- Có thể có nhiều hoặc không có tài khoản nào nạ p thẻ.

6.  Voucher  – Chi tiết đơn hàng: 

VoucherChi tiết

đơn hàngthuộc

(0,n) (1, 1)

 

- Một chi tiết đơn hàng diễn tả một cho một mã Voucher.

- Có không hoặc nhiều mãVoucher thuộc chi tiết đơn hàng. 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 23 

7.  Chi tiết đơn hàng –  Đơn hàng: 

Chi tiết

đơn hàng

Đơn hàngthuộc

(1,1) (1, n)

 

- Một chi tiết đơn hàng thuộc một đơn hàng.

- Đơn hàng có một hoặc nhiều chi tiết đơn hàng. 

8.  Đơn hàng - Loại hình thanh toán: 

Đơn hàngLoại hình thanh

toánthuộc

(1,n)(1, 1)

 

- Một đơn hàng thuộc duy nhất một loại hình thanh toán. 

- Một loại hình thanh toán có một hoặc nhiều đơn hàng. 

9.  Đơn hàng –  Khách hàng: 

Khách hàng Đơn hàngthanh toán(1,1)(0,n)

 

- Một đơn hàng do một khách hàng thanh toán. 

- Khách hàng có thể thanh toán nhiều đơn hàng hoặc không thanh toán đơn hàng nào. 

 Lƣợc đồ cơ sở dữ liệu: 

o  Bảng LoaiHinhDichVu:cung cấp các loại hình dịch vụ mà MuaVoucher 

hiện đang có (v í d ụ: Du lịch, Nhà hàng –  Ăn uống, Công nghệ, Vật dụng gia

đình,….) 

 

Loại hình dịch vụ

Mã loại hình

Tên loại hình

Trạng thái

 

LoaiHinhDichVu (MaLoaiHinh, TenLoaiHinh, TrangThai)

 

 

Hệ Quản Trị Cơ SởDữ Liệu 24 

STT Tên thuộc tính Kiểu dữ  liệu

Key Mô tả 

1 MaLoaiHinh Int Primary Mỗi một loại hình dịch vụ đều khácnhau tượng trưng cho một loại dịch vụ 

mà các Voucher thuộc về 

2 TenLoaiHinh nvarchar(50) Unique Tên loại hình định nghĩa cho từng loại

hình dịch vụ có trong MuaVoucher  3 TrangThai Int Các loại hình dịch vụ có thể bị thay đổi

trong MuaVoucher, vì vậy tr ạng thái biểu diễn cho loại hình màMuaVoucher đang có vớ i 2 số nguyên.0: ngừng hoạt động, 1: đang hoạtđộng.

o  Bảng LoaiHinhThanhToan:MuaVoucher sẽ đưa ra các hình thức thanh toán

nhằm đáp ứng nhu cầu mua hàng của khách hàng, ví dụ: tr ả sau ( thanh toán ngay khi

giao voucher ) hoặc tr ả trướ c ( nạ p thẻ voucher sau đó hệ thống sẽ tr ừ tr ực tiếp vào tài

khoản)

 

Loại hình thanh

toán

(1,n) Mã loại hình thanh

toán

Tên loại hình thanh

toán

Trạng thái 

LoaiHinhThanhToan (MaLoaiHinhThanhToan,TenLoaiHinhThanhToan,TrangThai)

 

 

Hệ Quản Trị Cơ SởDữ Liệu 25 

STT Tên thuộc tính Kiểu dữ liệu Key Mô tả 1 MaLoaiHinhThanhToan Int Primary Mỗi một loại hình thanh toán

đều khác nhau tượng trưngcho hình thức để khách hàngthanh toán trên MuaVoucher  

2 TenLoaiHinhThanhToan nvarchar(50) Tên loại hình thanh toán định

nghĩa cho từng loại hìnhthanhtoáncó trongMuaVoucher 

3 TrangThai Int Tr ạng thái biểu diễn cho loại

hình thanh toán màMuaVoucher đang có vớ i 2số nguyên. 0: ngừng hoạt

động, 1: đang hoạtđộng.

o  Bảng Voucher:Doanh nghiệp có thể thêm, xóa, sửa các sản phẩm có Voucher do

doanh nghiệp đó cung cấp tùy theo nhu cầu của khách hàng. 

 

Voucher(1,1)

(1,1)

(0, n)

Mã voucher Tên voucher 

 Ngày bắt đầu

 Ngày kết thúcGiá khuyến mãi

Số lượng

Giá gốc

Thông tin chi tiết

Trạng thái

Url hình

 

Voucher (MaVoucher,TenVoucher,ThongTinChiTiet, NgayBatDau, NgayKetThuc,

GiaGoc, GiaKhuyenMai, SoLuong,UrlHinh,TrangThai, MaLoaiHinhDV, MaTaiKhoanQL)

 

 

Hệ Quản Trị Cơ SởDữ Liệu 26 

STT Tên thuộc tính Kiểu dữ liệu Key Mô tả 1 MaVoucher Int Primary Mỗi một mã voucher 

đều khác nhau đi ớ itừng sản phẩm cóVoucher 

2 TenVoucher nvarchar(50) Mỗi mã Vouher đều cótên Voucher tương ứng

3 ThongTinChiTiet nvarchar(1000) Để khách hàng có cáinhìn tổng thể doanhnghiệ p cần mô tả cácthông tin có liên quanđến Voucher như ngày

 bắt đầu và ngày kếtthúc rao bán voucher,số lượ ng tối đa của

Voucher trên sản phẩmđó, doanh nghiệ p cần

đưa rõ giá gốc và giákhuyến mãi khi kháchhàng mua voucher kèmvới các thông tin chitiết của voucher.

4 NgayBatDau datetime

5 NgayKetThuc datetime

6 GiaGoc decimal(18,0)

7 GiaKhuyenMai decimal(18,0)

8 SoLuong int

9 TrangThaiInt

Tr ạng thái biểu diễn

sản ph ẩm mà doanhnghiệp đăng trênMuaVoucher vớ i 2 số 

nguyên. 0: ngừng hoạtđộng, 1: đang hoạt

 

 

Hệ Quản Trị Cơ SởDữ Liệu 27 

động.

10 MaLoaiHinhDV Int Foreignthamchiếu đến bảng

LoaiHinhDichVu.

Một mã voucher ứngvớ i một loại hình dịch

vụ mà doanh nghiệ pcung cấ p.

11 MaDoanhNghiep Int Foreigntham

chiếu đến bảng NguoiDung.

Mỗi một Voucher đượ cquản lý bở i một doanhnghiệ p

12 UrlHinh nvachar(500) Ứ ng vớ i mỗi Voucher 

sẽ có hình ảnh cụ thể 

quảng cáo cho voucher đó 

o  Bảng HopDong:Trướ c k hi đăng các Voucher trên trang MuaVoucher doanh nghiệ p

 phải ký vớ i MuaVoucher hợp đồng để hợp tác và quảng cáo sản phẩm của doanh

nghiệ p

Hợp đồng

Mã hợp đồng

 Ngày ký

Thời hạn

Trạng tháiMô tả

(1,1)

 

HopDong (MaHopDong, NgayKy, ThoiHan, MoTa, TrangThai, MaDoanhNghiep)

STT Tên thuộc tính Kiểu dữ liệu Key Mô tả 1 MaHopDong Int Primary Mỗi một mã hợp đồng

là riêng biệt đối với cácdoanh nghiệ p hợp tácvớ i MuaVoucher 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 28 

2 NgayKy datetime Một hợp đồng cần cóngày kí kết hợp đồng

cùng vớ i thờ i gian hết

hợp đồng kèm theo đónhững điều lệ khi 2 bênthỏa thuận vớ i nhau

3 ThoiHan datetime

4 MoTa nvarchar(1000)

5 TrangThai Int Tr ạng thái biểu diễn

doanh nghiệp có cònhay không còn hợp tácvớ i MuaVoucher, vớ i 2số nguyên. 0: ngừng

hoạt động, 1: đang hoạt

động.

6 MaDoanhNghiep Int Foreignthamchiếu đến

 bảng

 NguoiDung.

Chỉ ra hợp đồng thuộcdoanh nghiệ p

o  Bảng TheNap:Đối với hình thức thanh toán trực tiế p MuaVoucher cung cấ p cho

thành viên thẻ mua Voucher với các mệnh giá khác nhau.

Thẻ nạp

(1,1) Mã thẻ

Series

Code thẻ

Mệnh giá

 Ngày nạp

Trạng thái Tỉ lệ khuyến mãi 

TheNap (MaTheNap, Series, Code, MenhGia, NgayNap, TiLeKhuyenMai,TrangThai,

MaTaiKhoan)

 

 

Hệ Quản Trị Cơ SởDữ Liệu 29 

STT Tên thuộc tính Kiểu dữ liệu Key Mô tả 1 MaTheNap Int Primary Mỗi thẻ nạp là duy

nhất và chỉ sử dụng

đượ c một lần

2 Series varchar(50) Unique Mỗi thẻ nạp có số 

series là duy nhất

3 Code varchar(50) Unique Mỗi thẻ nạp có codelà duy nhất

4 MenhGia decimal(18,0) Tùy theo thẻ nạ p doMuaVoucher bán cómệnh giá khác nhau,và tỉ lệ khuyến mãi vàngày nạ p thẻ.

5 NgayNap datetime

6 TiLeKhuyenMai Int

7 TrangThai Int Tr ạng thái cho biếtthẻ nạ p đã đượ c nạ phay chưa nạ p, vớ i 2số nguyên. 0: chưanạp, 1: đã đượ c nạ p

8 MaTaiKhoan Int Foreignthamchiếu đến bảng

TaiKhoanTheNap.

Mỗi thẻ nạp là củamột tài khoản.

o  Bảng TaiKhoanTheNap:Sau khi nạ p thẻ khách hàng có thể xem số dư tài khoản

của mình qua bảng TaiKhoanTheNap

 

Tài khoản thẻ nạp

Mã tài khoản

(1,1)

Số dư tài khoản

Trạng thái

(0,n)

 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 30 

TaiKhoanTheNap (MaTaiKhoan, SoDuTaiKhoan, TrangThai, MaKhachHang)

STT Tên thuộc tính Kiểu dữ liệu Key Mô tả 1 MaTaiKhoan int Primary Mỗi mã tài khoản là duy

nhất.

2 SoDuTaiKhoan decimal(18,0) Khách hàng có thể xem

số tiền còn lại trong tàikhoản thẻ của mình. 

3 TrangThai int Tr ạng thái cho biết tàikhoàn thẻ nạp còn hayhết, vớ i 2 số nguyên. 0:đã hết tiền trong tàikhoản, 1: còn tiền trongtài khoản

4 MaKhachHang int Foreignthamchiếu đến

 bảng

 NguoiDung,Unique

Khách hàng có một mãtài khoản.

o  Bảng DonHang:Khách hàng đượ c quyền xem lại đơn hàng của mình. 

 

Đơn hàng

(1,1)

(1, n)

(1,1)

Mã ĐH Địa chỉ giao hàngTổng tiền

 Ngày giao

Tình trạng

 Ngày đặt hàng

 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 31 

DonHang (MaDonHang, DiaChiGiaoHang, NgayDatHang, NgayGiao, TongTien,

TrangThai, MaKhachHang, MaLoaiHinhThanhToan)

STT Tên thuộc tính Kiểu dữ liệu Key Mô tả 1 MaDonHang Int Primary Mỗi mã đơn

hàng là duy nhất,

 phân biệt vớ itừng đơn hàng. 

2 DiaChiGiaoHang nvarchar(500) Trong đơn hàngkhách hàng cóthể xem cácthông tin nhưngày đặt hàngngày giao hàng,địa chỉ giao hàngvà tổng tiền hàngmà khách hàngđã đặt mua.

3 NgayDatHang Datetime

4 NgayGiao Datetime

5 TongTien decimal(18,0)

6 TrangThai Int Tình trạng biểudiễn cho một

đơn hàng vớ i 4

số nguyên : 0_ chưa xác nhận

đơn hàng ,1_ đãđược xác nhậnđơn hàng ,2_đang giaohàng , 3_đã giao.

7 MaKhachHang Int Foreigntham chiếu

đến bảng NguoiDung.

Mỗi đơn hàng làcủa một kháchhàng 

8 MaLoaiHinhThanhToan Int Foreigntham chiếu Mỗi đơn hàng có

 

 

Hệ Quản Trị Cơ SởDữ Liệu 32 

đến bảngLoaiHinhThanhToan.

một hình thứcthanh toán riêng 

o  Bảng ChiTietDonHang:Khách hàng có thể xem voucher và số lượng Voucher đã

mua thông qua bảng ChiTietDonHang.

Chi tiết

đơn hàngthuộc thuộc

(1,1)(1,1)(0, n) (1, n)

Số lượng

Thành tiền

 

ChiTietDonHang (MaChiTietDonHang, MaDonHang, MaVoucher, SoLuong, ThanhTien)

STT Tên thuộc tính Kiểu dữ liệu Key Mô tả 1 MaChiTietDonHang int Primary Mỗi mã chi tiết đơn

hàng là duy nhất.

2 MaDonHang int Foreigntham

chiếu đến

 bảngDonHang.

Cho biết chi tiết đơnhàng đó thuộc đơn hàngnào. 

3 MaVoucher int Các voucher đã mua 

4 SoLuong int Số lượng voucher cũngnhư thành tiền ứng vớ isố lượng voucher màkhách hàng mua 

5 ThanhTien decimal(18,0)

 

 

Hệ Quản Trị Cơ SởDữ Liệu 33 

6 TrangThai int Vớ i 2 số nguyên biểudiễn 0: ngưng hoạt

động, 1: đang hoạt

động.

o  Với cây phân cấp ta chia thành 2 bảng:

Doanh nghiệp

Người dùng

Khách hàng(1,n)

(1,1)

(0, n) (0, n)

 Ngày thành lậpCMND

 Ngày sinh

Giới tính

 Ngày

Tháng

 Năm

Mã ND

Tên đăng nhập

Mât khẩu

Họ và tên

Email

Địa chỉ

Đường QuậnThành phố

Số điện thoại

Trạng thái

Admin

(1, n)

 

- LoaiNguoiDung (MaLoaiNguoiDung, TenLoaiNguoiDung,TrangThai)

STT Tên thuộc tính Kiểu dữ liệu Key Mô tả 1 MaLoaiNguoiDung int Primary Mỗi một loại người dùng

là khách nhau. 2 TenLoaiNguoiDung nvarchar(200) Unique Tên người dùng là

Khách hàng, Admin,Doanh Nghiệ p.

3 TrangThai int Vớ i 2 số nguyên biểu

 

 

Hệ Quản Trị Cơ SởDữ Liệu 34 

diễn 0: ngưng hoạt động,1: đang hoạt động.

-  NguoiDung (MaNguoiDung , TenDangNhap, MatKhau, TenKhachHang, GioiTinh,

CMND, DiaChi, DienThoai, Email, MaTaiKhoan,TrangThai,LoaiNguoiDung)

STT Tên thuộc tính Kiểu dữ liệu Key Mô tả 1 MaNguoiDung int Primary Mỗi người dùng có

một mã người dùngduy nhất.

2 TenDangNhap varchar(50) Unique

 Người dùng sau khiđăng ký vàoMuaVoucher cần cómột tên người dùng vàmật khẩu đăng nhậ phệ thống.Bên cạnh đócần cung cấp thêmthông tin về tên ngườ idùng, ngày sinh, giớ itính, chứng minh nhândân, địa chỉ, điện

thoại, email của

ngườu dùng. 

3 MatKhau varchar(20)

4 TenNguoiDung nvarchar(50)

5 NgaySinh datetime

6 GioiTinh int

7 CMND varchar(50) Unique

8 DiaChi nvarchar(500)

9 DienThoai varchar(50)

10 Email varchar(50) Unique

 

 

Hệ Quản Trị Cơ SởDữ Liệu 35 

11 MaLoaiNguoiDung int Foreign thamchiếu đến bảng

LoaiNguoiDung.

Loại người dùng miêutả là Admin,Kháchhàng hay Doanh

 Nghiệp đượ c diễn bở i2 số nguyên: 0_làAdmin, 1 _Kháchhàng, 2_ Doanh

 Nghiệ p.

12 TrangThai int Admin có thể kíchhoạt hoặc vô hiệu hóangười dùng: 0_vôhiệu hóa, 1_kích hoạt

3.3   Ràng buộc c ủa cơ sở d ữ li ệu 

A. Rule:

i.  Tạo Rule:

o  Kiểm tra giá trị dương: 

CREATERULE ur_GiaTriDuong

AS @GiaTri>=0

GO

o  Ràng buộc thuộc tính Trạng thái: 

CREATERULE ur_TrangThaiAS @TT IN(1,0)

GO

o  Ràng buộc giới tính: 

CREATERULE ur_GioiTinh

AS @TT IN(1,2,3)

GO

ii.  Cài đặt Rule cho các bảng:

1.  Thẻ Nạp:

o  Mệnh giá trong Thẻ Nạ p phải >= 0

 

 

Hệ Quản Trị Cơ SởDữ Liệu 36 

sp_bindRule'ur_GiaTriDuong','TheNap.MenhGia'

o  Tỉ lệ khuyến mãi trong thẻ nạ p >= 0

sp_bindRule'ur_GiaTriDuong','TheNap.TiLeKhuyenMai'

o  Tr ạng thái trong thẻ nạ p phải có giá trị 0 , 1( 1: hoạt động, 0: ngừng

hoạt động)

sp_bindRule'ur_TrangThai','TheNap.TrangThai'

2.  Voucher:

o  Giá gốc trong Voucher >= 0

sp_bindRule'ur_GiaTriDuong','Voucher.GiaGoc'

o  Giá khuyến mãi trong Voucher >= 0 

sp_bindRule'ur_GiaTriDuong','Voucher.GiaKhuyenMai'

o  Số lượ ng Voucher phải >= 0

sp_bindRule'ur_GiaTriDuong','Voucher.SoLuong'

o  Tr ạng thái trong Voucher phải có giá trị 0 , 1( 1: hoạt động, 0:

ngừng hoạt động)

sp_bindRule'ur_TrangThai','Voucher.TrangThai'

3.  Tài K hoản Thẻ Nạp:

o  Số dư trong tài khoản phải >= 0

sp_bindRule'ur_GiaTriDuong','TaiKhoanTheNap.SoDuTaiKhoan'

o  Tr ạng thái trong Tài Khoản Thẻ Nạ p phải có giá trị 0 , 1( 1: hoạtđộng, 0: ngừng hoạt động)

sp_bindRule'ur_TrangThai','TaiKhoanTheNap.TrangThai'

4.  Ngƣờ i Dùng: 

o  Tr ạng thái trong Ngườ i Dùng phải có giá trị 0 , 1( 1: hoạt động, 0:ngừng hoạt động)

 

 

Hệ Quản Trị Cơ SởDữ Liệu 37 

sp_bindRule'ur_TrangThai','NguoiDung.TrangThai'

o  Giới tính Người Dùng phải có giá trị 1,2,3( 1: nam, 2: nữ, 3: khác)

sp_bindRule'ur_GioiTinh','NguoiDung.GioiTinh'

5.  Loại Hình Thanh Toán: 

o  Tr ạng thái trong Loại Hình Thanh Toán phải có giá trị 0 , 1( 1: hoạtđộng, 0: ngừng hoạt động)

sp_bindRule'ur_TrangThai','LoaiHinhThanhToan.TrangThai'

6.  Loại Hình Dịch Vụ:

o  Tr ạng thái trong Loại Hình Dịch Vụ phải có giá trị 0 , 1( 1: hoạtđộng, 0: ngừng hoạt động)

sp_bindRule'ur_TrangThai','LoaiHinhDichVu.TrangThai'

7.  Hợp Đồng:

o  Tr ạng thái trong Hợp Đồng phải có giá trị 0 , 1( 1: hoạt động, 0:ngừng hoạt động)

sp_bindRule'ur_TrangThai','HopDong.TrangThai'

8.  Đơn Hàng: 

o  Tống tiền trong Đơn Hàng > = 0 

sp_bindRule'ur_GiaTriDuong','DonHang.TongTien'

o  Tr ạng thái trong Đơn Hàng phải có giá trị 0 , 1( 1: hoạt động, 0:ngừng hoạt động)

sp_bindRule'ur_TrangThai','DonHang.TrangThai'

9.  Chi Tiết Đơn Hàng: 

o  Thành tiền trong chi tiết đơn hàng >= 0 

sp_bindRule'ur_GiaTriDuong','ChiTietDonHang.ThanhTien'

o  Số lượ ng Voucher trong Chi Tiết Đơn Hàng phải > = 0

 

 

Hệ Quản Trị Cơ SởDữ Liệu 38 

sp_bindRule'ur_GiaTriDuong','ChiTietDonHang.SoLuong'

o  Tr ạng thái trong Chi Tiết Đơn Hàng phải có giá trị 0 , 1( 1: hoạt

động,0: ngừng hoạt động)

sp_bindRule'ur_TrangThai','ChiTietDonHang.TrangThai'

10. Doanh Nghiệp:

o  Tr ạng thái trong Doanh Nghiệ p phải có giá trị 0 , 1( 1: hoạt động,

0: ngừng hoạt động)

sp_bindRule'ur_TrangThai','DoanhNghiep.TrangThai'

B. Trigger:

1.Trong đơn hàng : ngày giao không đƣợc trƣớc ngày đặt và ngày đặt không đƣợc đặttrƣớc ngày hiện tại.

- Bối cảnh : DonHang

- Bảng tầm ảnh hưở ng:

Tên bảng Thêm  Xóa Sử aDonHang + - +

(NgayGiao,NgayDatHang)

- Cài đặt:

 Nếu trong dữ liệu vừa insert có tồn tại 1 đơn hàng mà ngày giao trước ngày đặt hoặc ngàygiao trước ngày hiện tại thì hiển thị lỗi và rollback lại giao tác 

CREATE TRIGGER tr_DonHang_ins_updOn DonHang

Forinsert,update

As

Begin 

declare @ngayhientai datetime

set @ngayhientai=GETDATE() If exists(select*from inserted I

WhereDatediff (DD, I. NgayGiao, I. NgayDatHang)> 0

or Datediff (DD, I. NgayGiao, @ngayhientai)> 0

or Datediff (DD, I. NgayDatHang, @ngayhientai)> 0)

Begin

 

 

Hệ Quản Trị Cơ SởDữ Liệu 39 

Raiserror ('Ngay dat hang hoac ngay giao khong hop le',0,1)

Rollbacktransaction 

EndEnd 

Go 

2. Trong hợp đồng : Thờ i hạn không đƣợc trƣớc ngày ký và thờ i hạn, ngày ký khôngđƣợc trƣớc ngày hiện tại

- Bối cảnh: HopDong

- Bảng tầm ảnh hưở ng:

Tên bảng Thêm  Xóa Sử aHopDong + - +

(NgayKy,ThoiHan)

-Cài đặt: Nếu trong dữ liệu vừa insert có tồn tại 1 hợp đồng mà thờ i hạn trước ngày ký hoặc ngày kýtrước ngày hiện tại, hoặc thờ i hạn trước ngày hiện tại thì hiển thị lỗi và rollback lại giao tác 

CREATE TRIGGER tr_HopDong_ins_updOn HopDong

Forinsert,update

AsBegin 

declare @ngayhientai datetime

set @ngayhientai=GETDATE() If exists(select*from inserted I

WhereDatediff (DD, I.Thoihan, I. NgayKy)> 0

or Datediff (DD, I. NgayKy, @ngayhientai)> 0 or Datediff (DD, I.Thoihan, @ngayhientai)> 0 

)

Begin

Raiserror ('Ngay ky hop dong hoac thoi han khong hop le',0,1)Rollbacktransaction 

End

End Go 

3. Trong Voucher :

+ ngày kết thúc không đƣợc trƣớc ngày bắt đầu và ngày bắt đầu không đƣợc trƣớ cngày hiện tại

+ giá khuyến mãi không đƣợ c lớn hơn giá gốc

 

 

Hệ Quản Trị Cơ SởDữ Liệu 40 

- Bối cảnh: Voucher 

- Bảng tầm ảnh hưở ng:

Tên bảng Thêm  Xóa Sử aVoucher + - +

(NgayBatDau,NgayKetThuc,GiaGoc,GiaKhuyenMai)

Cài đặt:

- Nếu trong dữ liệu vừa insert có tồn tại 1 Voucher mà ngày kết thúc trước ngày bắt đầu,

hoặc ngày bắt đầu, ngày kết thúc trước ngày hiện tại thì hiển thị lỗi và rollback lại giao tác

- Nếu trong dữ liệu vừa insert có tồn tại 1 Voucher mà giá khuyến mãi lớn hon giá gốc thìhiển thị lỗi và rollback lại giao tác 

CREATE TRIGGER tr_Voucher_ins_updOn Voucher 

Forinsert,update

AsBegin 

declare @ngayhientai datetime

set @ngayhientai=GETDATE() 

If exists(select*from inserted IWhereDatediff (DD, I. NgayKetThuc, I. NgayBatDau)> 0

or Datediff (DD, I. NgayKetThuc, @ngayhientai)> 0 

or Datediff (DD, I. NgayBatDau, @ngayhientai)> 0 ) Begin

Raiserror ('Ngay bat dau hoac ngay ket thuc khong hop le',0,1)

Rollbacktransaction 

End

If Exists(Select*from inserted I

where I.GiaKhuyenMai > I.GiaGoc)  BeginRaiserror ('Gia Khuyen Mai khong hop le',0,1)

Rollbacktransaction 

End

End Go 

4. Ngày sinh của của ngƣời dùng không đƣợc trƣớc 01/01/1990 và sau ngày hiện tại

- Bối cảnh: NguoiDung

- Bảng tầm ảnh hưở ng:

Tên bảng Thêm  Xóa Sử a

 

 

Hệ Quản Trị Cơ SởDữ Liệu 41 

 NguoiDung + - +(NgaySinh)

-Cài đặt:

 Nếu trong dữ liệu vừa insert có tồn tại 1 ngườ i dùng mà năm sinh sau năm hiện tại hoặc

trước năm 1900 thì hiển thị lỗi và rollback lại giao tác 

CREATE TRIGGER tr_NguoiDung_ins_upd

On NguoiDung

Forinsert,update

AsBegin 

declare @ngayhientai datetime

set @ngayhientai=GETDATE() If exists(select*from inserted I

WhereDatediff (yy, I. NgaySinh, @ngayhientai)< 1

Or Datediff (yy, I. NgaySinh,'1900-1-1')> 0

)Begin

Raiserror ('Ngay sinh khong hop le',0,1)

Rollbacktransaction End

End 

Go 

5.Chi tiết đơn hàng – Voucher: Khách hàng không đƣợc mua quá số lƣợng còn lại của

Voucher

- Bối cảnh: Voucher, ChiTietDonHang

-Bảng tầm ảnh hưở ng:

Tên bảng Thêm  Xóa Sử aVoucher + - +

(GiaKhuyenMai)

ChiTietDonHang + + +

(SoLuong,MaVoucher)

Cài đặt:

- Khi insert 1 chi tiết đơn hàng mà khách hàng mua quá số lượng còn lại thì hiển thị lỗi vàrollback lại giao tác 

CREATE TRIGGER tr_ChiTietDonHang_ins_Voucher 

ON ChiTietDonHang

Afterinsert

 

 

Hệ Quản Trị Cơ SởDữ Liệu 42 

As

Begin 

IFExists(select*from inserted I,Voucher Vwhere I.MaVoucher = V.MaVoucher And

I.SoLuong > V.SoLuong)

BeginRaiserror ('So Luong Khong Hop Le',0,1)

Rollbacktransaction

End

elseBegin

---Cap Nhat lai so luong voucher con lai

Update Voucher Set SoLuong = v.SoLuong-i.SoLuongFrom Voucher v , inserted i

Where v.MaVoucher =i.MaVoucher 

---Tinh Thanh tien Voucher duoc mua trong Chi Tiet Don hang

Update ChiTietDonHang set ThanhTien =i.SoLuong*v.GiaKhuyenMaiFrom ChiTietDonHang ct ,inserted i,Voucher v

where ct.MaChiTietDonHang = i.MaChiTietDonHang and 

v.MaVoucher =i.MaVoucher 

End

End

Go

- Nếu khách hàng hủy Voucher thì phải cậ p nhật lại số lượ ng Voucher về tr ạng thái cũ 

CREATE TRIGGER tr_ChiTietDonHang_del_Voucher 

ON ChiTietDonHangAfterdelete

As

Begin 

Update Voucher Set SoLuong = v.SoLuong+d.SoLuongFrom Voucher v , deleted d

Where v.MaVoucher =d.MaVoucher 

End

Go

- Khi update 1 chi tiết đơn hàng mà khách hàng mua quá số lượng còn lại thì hiển thị lỗi vàrollback lại giao tác 

CREATE TRIGGER tr_ChiTietDonHang_upd_Voucher 

ON ChiTietDonHang

 

 

Hệ Quản Trị Cơ SởDữ Liệu 43 

Afterupdate

As

Begin IFExists(select*from inserted I,Voucher V

where I.MaVoucher = V.MaVoucher And

I.SoLuong > V.SoLuong)Begin

Raiserror ('So Luong Khong Hop Le',0,1)

Rollbacktransaction

Endelse

Begin

declare @mavc1 intdeclare @mavc2 int

select @mavc1=I.MaVoucher from inserted I

select @mavc2=D.MaVoucher from deleted D

if (@mavc1=@mavc2)--Xet neu thay doi mavoucher thi phai cap nhat laiso luong

 begin

---Cap Nhat lai so luong voucher con lai cua bang voucher khi

them chitietdonhang moiUpdate Voucher Set SoLuong = v.SoLuong-i.SoLuong

From Voucher v , inserted i

Where v.MaVoucher =i.MaVoucher 

---Cap nhat so voucher con lai tren bang voucher khi delete

chitietdonhang cu

Update Voucher Set SoLuong = v.SoLuong+d.SoLuongFrom Voucher v , deleted d

Where v.MaVoucher =d.MaVoucher 

end

---Tinh lai Thanh tien Voucher duoc mua trong Chi Tiet Don hang

Update ChiTietDonHang set ThanhTien =i.SoLuong*v.GiaKhuyenMaiFrom ChiTietDonHang ct ,inserted i,Voucher v

where ct.MaChiTietDonHang = i.MaChiTietDonHang and 

v.MaVoucher =i.MaVoucher 

End

EndGo

- Tính lại Thành tiền trong Chi tiết đơn hàng khi thay đổi giá khuyến mãi của Voucher 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 44 

CREATE TRIGGER tr_Voucher_upd_ChiTietDonHang

ON Voucher 

AfterupdateAs

Begin

Begin

Update ChiTietDonHang set ThanhTien=ct.SoLuong*i.GiaKhuyenMai

From ChiTietDonHang ct ,inserted i

where ct.MaVoucher = i.MaVoucher End

End

Go

6. Chi tiết đơn hàng –  Đơn hàng: Tổng tiền trong Đơn hàng phải ứ ng với Thành tiềnvà Số lƣợ ng trong Chi tiết đơn hàng 

- Bối cảnh: DonHang,ChiTietDonHang

- Bảng tầm ảnh hưở ng:

Tên bảng Thêm  Xóa Sử aDonHang - - +

(TongTien)

ChiTietDonHang + + +(ThanhTien,MaDonHang)

Cài đặt:

- Cậ p nhật lại Tổng tiền trong Đơn hàng khi thêm 1 Chi tiết đơn hàng

CREATE TRIGGER tr_ChiTietDonHang_ins_DonHang

ON ChiTietDonHangForinsert

As

Begin

--Cap nhat lai tong tien khi them 1 chi tiet don hangUpdate DonHang Set TongTien = dh.TongTien+i.ThanhTien

From DonHang dh ,inserted i

Where dh.MaDonHang = i.MaDonHangEnd

Go

- Cậ p nhật lại Tổng tiền trong Đơn hàng khi hủy Chi tiết đơn hàng 

CREATE TRIGGER tr_ChiTietDonHang_del_DonHang

ON ChiTietDonHang

 

 

Hệ Quản Trị Cơ SởDữ Liệu 45 

Fordelete

As

BeginUpdate DonHang Set TongTien = dh.TongTien-d.ThanhTien

From DonHang dh ,deleted d

Where dh.MaDonHang = d.MaDonHangEnd

Go

- Cậ p nhật lại Tổng tiền trong Đơn hàng khi update 1 Chi tiết đơn hàng 

CREATE TRIGGER tr_ChiTietDonHang_upd_DonHang

ON ChiTietDonHangForupdate

As

Begin

--Cap nhat lai tong tien khi them 1 chi tiet don hang moiUpdate DonHang Set TongTien = dh.TongTien+i.ThanhTien

From DonHang dh ,inserted i

Where dh.MaDonHang = i.MaDonHang

--Cap nhat lai tong tien khi huy 1 chi tiet don hang cuUpdate DonHang Set TongTien = dh.TongTien-d.ThanhTien

From DonHang dh ,deleted d

Where dh.MaDonHang = d.MaDonHangEnd

Go

- Khi update Tổng tiền trong Đơn hàng thì phải tính lại Thành tiền trong Chi tiết đơn hàngcho phù hợ  p

CREATE TRIGGER tr_DonHang_upd_ChiTietDonHang

ON DonHang

Forupdate

AsBegin 

declare @tongtien decimal(18,0)

select @tongtien =Sum(ct.ThanhTien)From ChiTietDonHang ct,inserted i where ct.MaDonHang=i.MaDonHang

Update DonHang Set TongTien = @tongtien

From DonHang dh ,inserted i

Where dh.MaDonHang = i.MaDonHangEnd

Go 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 46 

4  MÔ TẢ TÌNH HUỐNG TRANH CHẤP ĐỒNG THỜ I

4.1    Mô tả th ủ t ục c ủa h ệ th ố ng 

1) Thủ tục 1: sp_KiemTraDangNhap

a.  Mục đích sử dụng thủ tục: kiểm tra tài khoản hợ  p lệ hay không 

 b.  Ý nghĩa các tham số 

- @TenDangNhap (varchar): tên đăng nhậ p- @TenDangNhap (varchar): mật khẩu của người dùng 

- @ID (int) output: tham số đầu ra để lưu mã người dùng 

- @flag (int) output: tham số đầu ra để thông báo và lưu loại người dùng 

c.  Các bước đặt tả thủ tục.

1.  Nhận các tham số đầu vào 

2. Kiểm tra @TenDangNhap và @MatKhau có tồn tại hay không? 

3. - Nếu tài khoản không tồn tại, gán @flag = -1 (đăng nhậ p thất bại)

- Nếu tồn tài khoản tồn tại, thực hiện lấy LoaiNguoiDung ở bảng

 NguoiDung vớ i TenDangNhap = @TenDangNhap r ồi sau đó gán vào 

@flag. Lấy MaNguoiDung gán vào @ID (trườ ng hợ  p mật khẩu đúng,đăng nhập thành công) vớ i TenDangNhap = @TenDangNhap vàMatKhau = @MatKhau , ngượ c lại nếu mật khẩu không đúng gán @flag= 0 (đăng nhậ p không thành công) 

2) Thủ tục 2: sp_ThayDoiMatKhau

a.  Mục đích sử dụng thủ tục : hỗ tr ợ  người dùng thay đổi mật khẩu

 b.  Ý nghĩa các tham số:

- @MaND (int) : mã người dùng cần thay đổi mật khẩu

- @MatKhauMoi (varchar): mật khẩu mới người dùng muốn thay đổi

c.  Các bước đặt tả thủ tục.

1.   Nhận tham số đầu vào là @MaND và @MatKhauMoi 2.  Cậ p nhật lại mật khẩu thành mật khẩu mớ i với mã người dùng là

@MaND

3) Thủ tục 3: sp_DangKy

a.  Mục đích sử dụng thủ tục: hỗ tr ợ  người dùng đăng ký tài khoản mớ i b.  Ý nghĩa các tham số:

- @TenDangNhap (varchar) : tên đăng nhập người dùng muốn đăng ký 

- @MatKhau (varchar): mật khẩu của người dùng 

- @TenNguoiDung (nvarchar): tên người dùng 

- @NgaySinh (datetime): ngày sinh của người dùng 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 47 

- @GioiTinh (int): giới tính (1: nam, 2: nữ, 3: khác) - @CMND (varchar): chứng minh nhân dân 

- @DienThoai (varchar): số điện thoại người dùng 

- @DiaChi(nvarchar): địa chỉ - @Email(varchar): địa chỉ Email

- @flag(int) output: biến kiểm tra thông tin tài khoản người dùng cần đăng kýmới đã tồn tại hay chưa? (giá trị -1: đã tồn tại, 1: chưa tồn tại)

c.  Các bước đặt tả thủ tục:

1.  Nhận các tham số đầu vào 

2. Kiểm tra tài khoản người dùng muốn đăng ký 

3. Thực hiện insert vào cơ sơ dữ liệu nếu tài khoản hợ  p lệ 

4. Insert thêm vào bảng TheNapTaiKhoan thêm 1 tài khoản mớ i với mãkhách hàng là của khách hàng vừa mới đăng ký 

4) Thủ tục 4: sp_LoadDSVoucher_all

a.  Mục đích sử dụng thủ tục: Lấy danh sách tất cả Voucher đang hoạt động vàngừng hoạt động.

 b.  Ý nghĩa các tham số: không tham số 

c.  Các bước cài đặt thủ tục:

1.  Lấy danh sách các Voucher từ cơ sở dữ liệu lên cho người dùng 

5) Thủ tục 5: sp_LoadDSVoucher_loaidv

a.  Mục đích sử dụng thủ tục: Lấy danh sách tất cả Voucher đang hoạt động theo 1

loại hình dịch vụ nào đó 

 b.  Ý nghĩa các tham số:

- @maloai (int) : mã loại hình dịch vụ 

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào là @maloai 2.  Chọn các Voucher có mã loại hình dịch vụ ứng với @maloai và trạng

thái là đang hoạt động

6) Thủ tục 6 : sp_LoadDSVoucher_doanhnghiep

a.  Mục đích sử dụng thủ tục: Lấy danh sách Voucher đang hoạt động của 1 doanh

nghiệp nào đó 

 b.  Ý nghĩa các tham số:

- @madn (int) : mã doanh nghiệ p

 

 

Hệ Quản Trị Cơ SởDữ Liệu 48 

c.  Các bước cài đặt thủ tục: 

1.  Nhận tham số đầu vào là @madn 

2. Chọn các Voucher đang hoạt động có mã doanh nghiệp tương ứng vớ i

@madn

7) Thủ tục 7: sp_XemChiTietVoucher

a.  Mục đích sử dụng thủ tục: Xem thông tin chi tiết của 1 Voucher 

 b.  Ý nghĩa các tham số:

- @MaVoucher (int) : mã Voucher cần xem thông tinc.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào là @MaVoucher 

2. Lấy thông tin chi tiết của Voucher có mã là @MaVoucher  và TrangThai

= 1 (đang hoạt động)

8) Thủ tục 8: sp_LoadDSLoai

a.  Mục đích sử dụng thủ tục: Lấy danh sách loại hình dịch vụ 

 b.  Ý nghĩa các tham số: không tham số 

c.  Các bước cài đặt thủ tục:

1. Lấy danh sách loại hình dịch vụ đang hoạt động

9) Thủ tục 9: sp_LoadDSDoanhNghiep

a.  Mục đích sử dụng thủ tục: Lấy danh sách doanh nghiệ p b.  Ý nghĩa các tham số: không tham số 

c.  Các bước cài đặt thủ tục:

1. Lấy danh sách người dùng đang hoạt động với mã loại người dùng là 2

(doanh nghiệ p)

10)  Thủ tục 10: sp_XemThongTinTaiKhoanTheNap

a.  Mục đích sử dụng thủ tục: Xem số dư tài khoản của khách hàng b.  Ý nghĩa các tham số:

- @MaNguoiDung (int) : mã khách hàng 

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào là @MaNguoiDung 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 49 

2. Lấy thông tin tài khoản đang hoạt động với mã khách hàng ứng vớ i

@MaNguoiDung

11)  Thủ tục 11: sp_LayIDTaiKhoanTheNap

a.  Mục đích sử dụng thủ tục: Lấy Mã tài khoản của người dùng 

 b.  Ý nghĩa các tham số:

- @MaKH (int): mã khách hàng 

- @MaTaiKhoan (int) output: mã tài khoản tr ả về 

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào là @MaKH và @MaTaiKhoan

2. Lấy mã tài khoản của khách hàng có mã khách hàng là @MaKH và gán

cho @MaTaiKhoan

12)  Thủ tục 12: sp_LoadLichSuNapThe

a.  Mục đích sử dụng thủ tục: Xem lịch sử nạ p thẻ của 1 khách hàng 

 b.  Ý nghĩa các tham số:

- @MaNguoiDung (int): mã khách hàng 

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào là @MaNguoiDung

2. Tạo biến @matk (output) để nhận mã tài khoản lấy đượ c từ k ết quả thực

thi thủ tục sp_LayIDTaiKhoanTheNap vớ i tham số đầu vào là

@MaNguoiDung

3. Lấy thông tin nạ p thẻ với Mã tài khoản tương ứng vớ i @matk 

13)  Thủ tục 13 : sp_KiemTraTheNap

a.  Mục đích sử dụng thủ tục: kiểm tra tính hợ  p lệ của thẻ nạ p b.  Ý nghĩa các tham số:

- @Series (varchar): số Series của thẻ nạ p- @Code (varchar): mã thẻ nạ p- @flag (int) output: biến nhận giá trị đầu ra (giá trị 0: thẻ nạp không đúng,ngượ c lại giá tr ị là mã thẻ nếu đúng)

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào là @Series và @Code 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 50 

2. Lấy MaTheNap từ bảng TheNap với điều kiện Series = @Series và Code

@Code và trạng thái đang hoạt động r ồi gán cho tham số @flag

14)  Thủ tục 14: sp_ThemTientaiKhoanTheNap

a.  Mục đích sử dụng thủ tục: thêm tiền vào tài khoản của khách hàng 

 b.  Ý nghĩa các tham số:

- @MaKH (int) : mã khách hàng 

- @MenhGia (decimal) : số tiền thêm vào tài khoản

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào là @MaKH và @MenhGia

2. Cộng thêm vào số dư tài khoản giá trị là @MenhGia cho khách hàng có

mã là @MaKH

15)  Thủ tục 15: sp_NapThe

a.  Mục đích sử dụng thủ tục: hỗ tr ợ  khách hàng nạ p thẻ vào tài khoản

 b.  Ý nghĩa các tham số:

@MaKH (int) : mã khách hàng 

@Series (varchar) : số Series của thẻ @Code (varchar) : mã thẻ 

@flag (int) output: mã thẻ nạ p của khách hàng 

c.  Các bước cài đặt thủ tục:

1.  Nhận các tham số đầu vào 

2. Thực thi thủ tục sp_KiemTraTheNap để kiếm tra tính hợ  p lệ của số Series

,Code thẻ và gán đầu ra (mã thẻ nạp) vào tham số flag

3.  Nếu thẻ hợ  p lệ thì thực hiện các bướ c 4 , ngượ c lại k ết thúc thủ tục

4. Tạo biến @TrangThai (int) để lấy tr ạng thái của thẻ nạ p vớ i Series =

@Series và Code = @Code. Nếu @TrangThai = 1 thì thực hiện tiếp bướ c

5,6,7,8. Ngượ c lại k ết thúc thủ tục.

5. Thực thi thủ tục sp_LayIDTaiKhoanTheNap để lấy mã tài khoản của

khách hàng 

6. Lấy mệnh giá và tỉ lệ khuyến mãi của thẻ vùa nạ p

 

 

Hệ Quản Trị Cơ SởDữ Liệu 51 

7. Thực thi thủ tục sp_ThemTientaiKhoanTheNap để thêm tiền vào tài

khoản cho khách hàng 

8. Cậ p nhật lại tình trạng thành thẻ đã nạ p cho Thẻ nạp có MaTheNap

=@flag

16)  Thủ tục 16: sp_KhuyenMai

a.  Mục đích sử dụng thủ tục: cậ p nhật tỉ lệ khuyến mãi cho thẻ nạ p b.  Ý nghĩa các tham số:

- @MenhGia (decimal): mệnh giá được áp dụng khuyến mãi của thẻ nạ p- @TileKM (int): tỉ lệ khuyến mãi của mệnh giá đó 

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào là @MenhGia và @TileKM

2. Cậ p nhật lại tỉ lệ khuyến mãi cho các thẻ nạ p chưa đượ c sử dụng có mệnh

giá bằng vớ i @MenhGia. Nếu @TileKM < 0 hoặc @TileKM > 100 thìrollback.

17)  Thủ tục 17: sp_ThemTheNap

a.  Mục đích sử dụng thủ tục: hỗ tr ợ chức năng thêm thẻ nạ p cho Admin

 b.  Ý nghĩa các tham số:

@Series (varchar) : Series của thẻ nạ p@Code (varchar): Code của thẻ nạ p@MenhGia (decimal): Mệnh giá 

c.  Các bước cài đặt thủ tục:

1.  Nhận các tham số đầu vào 

2. Kiểm tra xem trong bảng thẻ nạp đã tồn tại Series = @Series và Code =@Code hay chưa? 

3.  Nếu chưa thì thực hiện insert vô database 

18)  Thủ tục 18 : sp_ThemVoucher

a.  Mục đích sử dụng thủ tục: hỗ tr ợ chức năng thêm Voucher   b.  Ý nghĩa các tham số:

- @TenVoucher (nvarchar): tên Voucher - @ThongTinChiTiet (nvarvchar): thông tin chi tiết của Voucher 

- @NgayBatDau (datetime): ngày bắt đầu Voucher 

- @NgayKetThuc (datetime): ngày kết thúc 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 52 

- @GiaGoc (Decimal): giá gốc

- @GiaKhuyenMai (Decimal): giá khuyến mãi - @SoLuong (int): số lượ ng sản phẩm

- @MaLoaiHinhDV (int): mã loại hình dịch vụ 

- @MaDoanhNghiep (int): mã doanh nghiệ p cung cấ p Voucher 

- @UrlHinh (nvarchar): đườ ng dẫn đến file hình của Voucher 

c.  Các bước cài đặt thủ tục:

1.  Nhận các tham số đầu vào 

2. Thực hiện insert dữ liệu

19)  Thủ tục 19: sp_SuaVoucher

a.  Mục đích sử dụng thủ tục: hỗ tr ợ chức năng sửa Voucher 

 b.  Ý nghĩa các tham số:

- @MaVoucher (int): Mã Voucher  - @TenVoucher (nvarchar): tên Voucher - @ThongTinChiTiet (nvarvchar): thông tin chi tiết của Voucher 

- @NgayBatDau (datetime): ngày bắt đầu Voucher 

- @NgayKetThuc (datetime): ngày kết thúc 

- @GiaGoc (Decimal): giá gốc

- @GiaKhuyenMai (Decimal): giá khuyến mãi - @SoLuong (int): số lượ ng sản phẩm

- @MaLoaiHinhDV (int): mã loại hình dịch vụ 

- @MaDoanhNghiep (int): mã doanh nghiệ p cung cấ p Voucher 

- @UrlHinh (nvarchar): đườ ng dẫn đến file hình của Voucher 

c.  Các bước cài đặt thủ tục:

1.  Nhận các tham số đầu vào 

2. Thực hiện update thông tin của Voucher có mã là @MaVoucher (tr ừ 

@UrlHinh)

3. Kiểm tra nếu @UrlHinh khác rỗng thì thực hiện update UrlHinh =

@UrlHinh có MaVoucher = @MaVoucher 

20)  Thủ tục 20: sp_CapNhatTrangThaiVoucher

a.  Mục đích sử dụng thủ tục: cậ p nhật lại tr ạng thái Voucher (đang hoạt động hoặc

ngưng hoạt động)

 b.  Ý nghĩa các tham số:

- @MaVoucher (int): mã Voucher cần cậ p nhật

c.  Các bước cài đặt thủ tục:

 

 

Hệ Quản Trị Cơ SởDữ Liệu 53 

1.  Nhận tham số đầu vào 

2. Tạo biến @TrangThaiCu (int) để lấy tr ạng thái của Voucher có mã là@MAVoucher 

3. Tạo biến @TrangThaiMoi. Xét nếu @TrangThaiCu = 0 thì@TrangThaiMoi = 1 và ngượ c lại.

4. Thực hiện update lại tr ạng thái vớ i TrangThai = @TrangThaiMoi của

Voucher có mã là @MaVoucher 

21)  Thủ tục 21: sp_LoadDSDonHang_all

a.  Mục đích sử dụng thủ tục: Lấy danh sách tất cả đơn hàng 

 b.  Ý nghĩa các tham số: không tham số 

c.  Các bước cài đặt thủ tục:

1. Thực hiện câu lệnh select tất cả đơn hàng 

22)  Thủ tục 22 : sp_LoadDSDonHang_ChuaThanhToan

a.  Mục đích sử dụng thủ tục: Lấy danh sách các đơn hàng chưa được khách hàngthanh toán

 b.  Ý nghĩa các tham số: không tham số 

c.  Các bước cài đặt thủ tục:

1. Thực hiện select các Đơn hàng có trạng thái bằng 0 (chưa đượ c thanh

toán) 

23)  Thủ tục 23: sp_LoadDSDonHang_DaThanhToan

a.  Mục đích sử dụng thủ tục: Lấy danh sách các đơn hàng đã được khách hàngthanh toán 

 b.  Ý nghĩa các tham số: không tham số 

c.  Các bước cài đặt thủ tục:

1. Thực hiện select các Đơn hàng có trạng thái bằng 1 (đã được thanh toán) 

24)  Thủ tục 24: LaySanPhamCungLoai

a.  Mục đích sử dụng thủ tục: lấy danh sách các sản phẩm cùng loại vớ i sản phẩm

mà khách hàng đang xem 

 b.  Ý nghĩa các tham số 

@mavoucher (int): mã voucher 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 54 

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

2. Tạo biến @maloai (int) để lấy MaLoaiHinhDV của Voucher có mã@mavoucher 

3. Lấy ra danh sách Voucher đang hoạt động và có MaLoaiHinhDV =@maloai.

25) Thủ tục 25: LayThongTinDoanhNghiep

a.  Mục đích sử dụng: lấy ra thông tin doanh nghiệp đang bán voucher đó. 

 b.  Ý nghĩa các tham số:

@mavoucher (int): mã voucher  

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

2. Tạo biến @madoanhnghiep (int) để lấy MaDoanhNghiep của Voucher có

mã @mavoucher. 

3. Lấy ra doanh nghiệp có mã là @madoanhnghiep trong bảng NguoiDung

26)  Thủ tục26 : sp_LoadDSDonHangChuaThanhToan

a.  Mục đích sử dụng thủ tục: Ngườ i xem các đơn hàng chưa thanh toán.  b.  Ý nghĩa các tham số:

@MaNguoiDung (int): mã người dùng 

c. Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào2. Load danh sách đơn hàng có MaNguoiDung = @MaNguoiDung và có

TrangThai = 0 (chưa thanh toán). 

27)  Thủ tục 27: sp_LoadChiTietDonHang

a.  Mục đích sử dụng thủ tục: Khách hàng xem các đơn hàng chưa thanh toán.  b.  Ý nghĩa các tham số:

@MaDonHang (int): mã đơn hàng 

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào

 

 

Hệ Quản Trị Cơ SởDữ Liệu 55 

2. Load chi tiết đơn hàng có MaDonHang = @MaDonHang và cóTrangThai = 1 (đang hoạt động).

28)  Thủ tục 28: sp_ThemDonHang

a.  Mục đích sử dụng thủ tục: thêm một đơn hàng cho khách hàng 

 b.  Ý nghĩa các tham số:

1. @DiaChiGiaoHang (nvarchar(100)): địa chỉ giao hàng 

2. @NgayGiao (datetime): ngày giao hàng 

3. @MaKhachHang (int): mã khách hàng 

4. @MaLoaiHinhThanhToan (int): mã loại hình thanh toán 

5. @MaDonHang (int) output: mã đơn hàng c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào. 

2. Đếm các mã đơ n hàng có trong bảng Đơn Hàng. 

3. Mã đơn hàng hiện tại sẽ bằng vớ i số lượng các mã đơn hàng trong bảng

Đơn Hàng + 1. 

4. declare @NgayDatHang datetime:lấy ngày hiện tại của hệ thống

5. Tạo biến @trangthai. Nếu @MaLoaiHinhThanhToan = 1 thì @trangthai

= 1 và ngượ c lại.

6. Thực hiện insert vào database. 

29)  Thủ tục 29: sp_ThemChiTietDonHang

a.  Mục đích sử dụng thủ tục: thêm chi tiết đơn hàng cho một đơn hàng.

 b.  Ý nghĩa các tham số:

1. @MaDonHang (int ): mã đơn hàng 

2. @MaVoucher (int): mã Voucher  3. @SoLuong ( int): số lượ ng của một Voucher được khách hàng mua. 

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào. 

2. @soluongconlai = số lượ ng của Voucher = @MaVoucher có tr ong bảng

Voucher 

3.  Nếu @SoLuong<@soluongconlai

 

 

Hệ Quản Trị Cơ SởDữ Liệu 56 

i.  @GiaKhuyenMai = lấy GiaKhuyenMai có trong bảng Voucher vớ i

MaVoucher = @MaVoucher 

ii.  @ThanhTien = giá khuyến mãi * số lượ ng (@GiaKhuyenMai *

@SoLuong)

iii.  Cậ p nhật số lượng còn lại = @soluongconlai - @soluong vớ i trong

 bảng Voucher vớ i MaVoucher = @ MaVoucher 

iv.  Thực hiện insert vào database. 

30)  Thủ tục 30: sp_ChuyenTien_Admin

a.  Mục đích sử dụng thủ tục: chuyển tiền từ tài khoản của khách hàng sang tàikhoản của Admin sau khi khách hàng thanh toán đơn hàng 

 b.  Ý nghĩa các tham số:

- @MaKhachHang (int): mã khách hàng 

- @TienChuyen (decimal): số tiền chuyển từ tài khoản khách hàng sang tàikhoản của Admin

c.  Các bước cài đặt thủ tục:

1.  Nhận các tham số đầu vào 

2. Lấy số dư tại khoản của Admin tại MaTaiKhoan = 1 ( Admin có 1 tàikhoản mặc định có mã là 1) trong bảng TaiKhoanTheNap

3. Lấy số dư tài khoản của khách hàng tại MaKhanHang = @MaKhachHang

trong bảng TaiKhoanTheNap

4. Cộng thêm vào số dư tài khoản của Amin với giá trị thêm là@TienChuyen

5. Tr ừ số dư tài khoản của khách hàng cới giá trị tr ừ là @TienChuyen

6. Cậ p nhật lại số dư tài khoản của Admin và khách hàng 

31)  Thủ tục 31: sp_TinhLaiTongTien

a.  Mục đích sử dụng thủ tục: Tính lại tổng tiền trong Đơn hàng khi thêm hoặc cậ pnhật lại Chi tiết đơn hàng thuộc về Đơn hàng đó 

 b.  Ý nghĩa các tham số:

@MaDonHang (int): mã đơn hàng 

@tongtien (decimal) output: tổng tiền của đơn hàng 

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 57 

2. Tính tổng các ThanhTien trong bảng ChiTietDonHang vớ i MaDonHang

là @MaDonHang 

3. Cậ p nhật lại Tổng tiền của đơn hàng có mã là @MaDonHang và gán cho@tongtien.

32)  Thủ tục 32: sp_LoadThongTinNguoiDung

a.  Mục đích sử dụng thủ tục: lấy thông tin người dùng 

 b.  Ý nghĩa các tham số:

@MaNguoiDung (int): mã người dùng 

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào là @MaNguoiDung 

2. Thực hiện select với mã người dùng là @MaNguoiDung 

33)  Thủ tục 33: Load3SanPhamReNhat

a.  Mục đích sử dụng: lấy các voucher có giá bán rẻ nhất

 b.  Ý nghĩa các tham số: không có tham số 

c.  Các bước cài đặt thủ tục:

1. Sắ p xếp danh sách các Voucher đang hoạt động tăng dần theo

GiaKhuyenMai. Lấy ra 6 voucher đầu tiên. 

34)  Thủ tục 34: LoadDealHot

a.  Mục đích sử dụng: lấy các voucher có giá bán rẻ nhất

 b.  Ý nghĩa các tham số: không có tham số 

c.  Các bước cài đặt thủ tục:

1. Sắ p xếp danh sách các Voucher đang hoạt động tăng dần theo SoLuong.

Lấy ra 3 voucher đầu tiên. 

35)  Thủ tục 35: LoadDealMoi

a.  Mục đích sử dụng: lấy các voucher có giá bán rẻ nhất

 b.  Ý nghĩa các tham số: không có tham số 

c.  Các bước cài đặt thủ tục:

 

 

Hệ Quản Trị Cơ SởDữ Liệu 58 

1. Sắ p xếp danh sách các Voucher đang hoạt động tăng dần theo

 NgayBatDau. Lấy ra 18 voucher đầu tiên. 

36)  Thủ tục 36: LoadDSVoucher_DN_NgungHD

a.  Mục đích sử dụng: lấy danh sách các voucher ngừng hoạt động của 1 doanh

nghiệ p.

 b.  Ý nghĩa các tham số:

@madn (int): mã doanh nghiệ p

c.  Các bước cài đặt thủ tục:

1. Lấy ra doanh sách các voucher có MaDoanhNghiep = @madn và

TrangThai = 0 (ngừng hoạt động).

37)  Thủ tục 37: sp_CapNhatHopDong

a.  Mục đích sử dụng: Admin cậ p nhật lại tr ạng thái của hợp đồng.

 b.  Ý nghĩa các tham số:

@MaHopDong (int): mã hợp đồng

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

2. Tạo biến @TrangThaiCu (int) để lấy tr ạng thái của HopDong có mã là@MaHopDong

3. Tạo biến @TrangThaiMoi. Xét nếu @TrangThaiCu = 0 thì@TrangThaiMoi = 1 và ngượ c lại.

4. Thực hiện update lại tr ạng thái vớ i TrangThai = @TrangThaiMoi của

HopDong có mã là @MaHopDong 

38)  Thủ tục 38: sp_CapNhatTrangThaiDonHang

a.  Mục đích sử dụng: Admin cậ p nhật lại tr ạng thái đơn hàng 

 b.  Ý nghĩa các tham số:

@MaDonHang (int): mã đơn hàng 

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

2. Tạo biến @TrangThaiCu (int) để lấy tr ạng thái của DonHang có mã là@MaDonHang

 

 

Hệ Quản Trị Cơ SởDữ Liệu 59 

3. Tạo biến @TrangThaiMoi. Xét nếu @TrangThaiCu = 0 thì@TrangThaiMoi = 1 và ngượ c lại.

4. Thực hiện update lại tr ạng thái vớ i TrangThai = @TrangThaiMoi của

DonHang có mã là @MaDonHang 

39)  Thủ tục 39: sp_DanhSachVoucherDangHoatDong_DoanhNghiep

a.  Mục đích sử dụng: Lấy danh sách các voucher đang hoạt động của 1 doanh

nghiệ p.

 b.  Ý nghĩa các tham số:

@MaDN (int): mã doanh nghiệ p

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

2. Lay danh sách Voucher có MaDoanhNghiep = @MaDN và Trangthai = 1 

40)  Thủ tục 40: sp_DanhSachVoucherNgungHoatDong_DoanhNghiep

a.  Mục đích sử dụng: Lấy danh sách các voucher ngừng hoạt động của 1 doanh

nghiệ p.

 b.  Ý nghĩa các tham số:

@MaDN (int): mã doanh nghiệ p

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

2. Lấy danh sách Voucher có MaDoanhNghiep = @MaDN và Trangthai = 0 

41)  Thủ tục 41: sp_GiamGiaKhuyenMai

a.  Mục đích sử dụng: giảm giá khuyến mãi của 1 voucher 

 b.  Ý nghĩa các tham số:

@MaVoucher (int): mã voucher  

@GiaGiam (decimal): giá giảm

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

2. Tạo biến @GiaKhuyenMai nhận giá trị GiaKhuyenMai từ Voucher cóMaVoucher = @MaVoucher 

3. @GiaKhuyenMai = @GiaKhuyenMai + @GiaGiam

 

 

Hệ Quản Trị Cơ SởDữ Liệu 60 

4. Cậ p nhật lại GiaKhuyenMai = @GiaKhuyenMai của Voucher cóMaVoucher = @MaVoucher.

42)  Thủ tục 42: sp_LayDSThe_TT0

a.  Mục đích sử dụng: lấy danh sách thẻ nạp đã sử dụng

 b.  Ý nghĩa các tham số: không có tham số 

c.  Các bước cài đặt thủ tục:

1. Lấy danh sách thẻ nạp có TrangThai = 0 

43)  Thủ tục 43: sp_LayDSThe_TT1

a.  Mục đích sử dụng: lấy danh sách thẻ nạp chưa đượ c sử dụng

 b.  Ý nghĩa các tham số: không có tham số 

c.  Các bước cài đặt thủ tục:

1. Lấy danh sách thẻ nạ p có TrangThai = 1 

44)  Thủ tục 44: sp_LaySanPhamTheoNgay

a.  Mục đích sử dụng: lấy sản phẩm theo ngày 

 b.  Ý nghĩa các tham số:

@giatri (int): giá trị 

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

2. Tạo biến @ngayhn (datetime). Nếu @giatri = 1 thì select danh sáchvoucher đang hoạt động co NgayBatDau = @ngayhn và ngượ c lại.

45)  Thủ tục 45: sp_LayThongTinTaiKhoan

a.  Mục đích sử dụng: lấy thông tin tài khoản khách hàng 

 b.  Ý nghĩa các tham số:

@MaKh (int): mã khách hàng 

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

2. Select bảng TaiKhoanTheNap vớ i MaKhachHang = @MaKH

 

 

Hệ Quản Trị Cơ SởDữ Liệu 61 

46)  Thủ tục 46: sp_LoadDN

a.  Mục đích sử dụng: load danh sách doanh nghiệ p

 b.  Ý nghĩa các tham số: không có tham số 

c.  Các bước cài đặt thủ tục:

1. Lấy danh sách sách doanh nghiệ p trong bảng NguoiDung vóiMaLoaiNguoiDung = 2 (doanh nghiệp) và TrangThai = 1 (đang hoạtđộng)

47)  Thủ tục 47: sp_LoadDoanhNghiep

a.  Mục đích sử dụng: load danh sách doanh nghiệ p

 b.  Ý nghĩa các tham số: không có tham số 

c.  Các bước cài đặt thủ tục:

1. Lấy danh sách sách doanh nghiệ p trong bảng NguoiDung vóiMaLoaiNguoiDung = 2 (doanh nghiệp) và TrangThai = 1 (đang hoạtđộng)

48)  Thủ tục 48: sp_LoadDonHangKH

a.  Mục đích sử dụng: load danh sách đơn hàng của 1 khách hàng 

 b.  Ý nghĩa các tham số:

@makh (int): mã khách hàng 

@soluong (int) output: số lượ ng

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

2. Đếm số lượng đơn hàng của khách hàng có MaKhachHang = @makh gán

cho @soluong

3. Lấy danh sách đơn hàng của khách hàng có mã @makh 

49)  Thủ tục 49: sp_LoadDSHopDong

a.  Mục đích sử dụng: Admin xem danh sách hợp đồng

 

 

Hệ Quản Trị Cơ SởDữ Liệu 62 

 b.  Ý nghĩa các tham số: không có tham số 

c.  Các bước cài đặt thủ tục:

1. Lấy danh sách hợp đồng từ cơ sở dữ liệu

50)  Thủ tục 50: sp_LoadDSMenhGia

a.  Mục đích sử dụng: Load danh sách các mệnh giá của thẻ nạ p

 b.  Ý nghĩa các tham số: không có tham số 

c.  Các bước cài đặt thủ tục:

1. Lấy danh sách các mệnh giá trong bảng TheNap

51)  Thủ tục 51: sp_LoadDSVoucher_doanhnghiep_all

a.  Mục đích sử dụng: load danh sách voucher theo doanh nghiệ p

 b.  Ý nghĩa các tham số:

@madn (int): mã doanh nghiệ p

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

2. Lấy danh sách voucher có MaDoanhNghiep = @madn 

52)  Thủ tục 52: Sp_LoadDSVoucher_TheoDoanhNghiep

a.  Mục đích sử dụng: load danh sách voucher theo doanh nghiệ p

 b.  Ý nghĩa các tham số:

@madn (int): mã doanh nghiệ p

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

2. Lấy danh sách voucher có MaDoanhNghiep = @madn và

TrangThai = 1 (đang hoạt động).

53)  Thủ tục 53: sp_ThemHopDong

a.  Mục đích sử dụng: admin thêm một hợp đồng mớ i

 

 

Hệ Quản Trị Cơ SởDữ Liệu 63 

 b.  Ý nghĩa các tham số:

@ngayky (datetime): ngày ký 

@thoihan (datetime): thờ i hạn

@mota (nvarchar): mô tả 

@madn (int): mã doanh nghiệ p

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

2. Insert thông tin của hợp đồng mớ i xuống csdl

54)  Thủ tục 54: sp_ThongTinHopDong_DoanhNghiep

a.  Mục đích sử dụng: Lấy danh sách các hợp đồng của 1 doanh nghiệ p

 b.  Ý nghĩa các tham số:

@MaDN (int): mã doanh nghiệ p

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

2. Lấy danh sách hợp đồng có MaDoanhNghiep = @MaDN. 

55)  Thủ tục 55: sp_TimKiemTheoGia

a.  Mục đích sử dụng: Lấy danh sách các voucher theo giá đã chọn

 b.  Ý nghĩa các tham số:

@MucGia1 (decimal): giá nằm trong khoảng từ mức giá 1 

@MucGia2 (decimal): đến mức giá 2 

@soluong (int) output: số lượ ng

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

2. Đếm số lượng voucher đang hoạt động có GiaKhuyenMai nằm trong

khỏang từ @MucGia1 đến @MucGia2 và gán cho @soluong 

3. Select các voucher đang hoạt động có GiaKhuyenMai nằm trong khỏang

từ @MucGia1 đến @MucGia2

 

 

Hệ Quản Trị Cơ SởDữ Liệu 64 

56)  Thủ tục 56: sp_TimKiemTheoTen

a.  Mục đích sử dụng: Lấy danh sách các voucher theo tên đượ c nhậ p

 b.  Ý nghĩa các tham số:

@Ten (nvarchar): tên

@soluong (int) output: số lượ ng

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào 

2. Đếm số lượng voucher đang hoạt động có TenVoucher có chứa @Ten

3. Select các voucher đang hoạt động có TenVoucher có chứa @Ten

57)  Thủ tục 57: sp_XemChiTietVoucher0

a.  Mục đích sử dụng thủ tục: Xem thông tin chi tiết của 1 Voucher đang ngừng

hoạt động

 b.  Ý nghĩa các tham số:

@MaVoucher (int) : mã Voucher cần xem thông tinc.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào là @MaVoucher 

2. Lấy thông tin chi tiết của Voucher có mã là @MaVoucher  và

TrangThai = 0 (ngừng hoạt động).

58)  Thủ tục 58: sp_XemDanhSachHopDongConThoiHan

a.  Mục đích sử dụng thủ tục: Xem danh sách hợp đồng còn thờ i hạn

 b.  Ý nghĩa các tham số:

- @maDN (int) : mã doanh nghiệ p- @soluong (int) output: số lượ ng

c.  Các bướ c cài đặt thủ tục:

1.  Nhận tham số đầu vào là @MaVoucher 

2. Đếm số lượ ng hợp đồng của doanh nghiệp có mã là @maDN và

TrangThai = 1

3. Lấy danh sách hợp đồng của doanh nghiệp có mã là @maDN và

TrangThai = 1

59)  Thủ tục 59: sp_XemDanhSachHopDongHetThoiHan

 

 

Hệ Quản Trị Cơ SởDữ Liệu 65 

a.  Mục đích sử dụng thủ tục: Xem danh sách hợp đồng hết thờ i hạn b.  Ý nghĩa các tham số:

- @maDN (int) : mã doanh nghiệ p- @soluong (int) output: số lượ ng

c.  Các bước cài đặt thủ tục:

1.  Nhận tham số đầu vào là @MaVoucher 

2. Đếm số lượ ng hợp đồng của doanh nghiệp có mã là @maDN và

TrangThai = 0

3. Lấy danh sách hợp đồng của doanh nghiệp có mã là @maDN và

TrangThai = 0

4.2    Mô tả tình huố ng tranh ch ấp đồng th ờ i 

1. 

Trƣờ ng hợ p 1:

a.  Tình huống:

Hai giao tác T1 và T2 cùng cậ p nhật lại giá khuyến mãi của một Voucher trong

cùng một thời điểm.

b.  Mô Tả:

  Mô tả T1:

  T1 nhận các tham số đầu vào 

  Đọc gía khuyến mãi của Voucher 

  Cậ p nhật lại giá khuyến mãi của Voucher 

  Mô tả T2:

  T2 nhận các tham số đầu vào 

  Đọc gía khuyến mãi của Voucher 

  Cậ p nhật lại giá khuyến mãi của Voucher 

c. K ịch Bản:

T1

Cập nhật giá khuyến mãi của Voucher

T2

Cập nhật giá khuyến mãi của Voucher

Bắt đầu giao tác T1(Begin Tran) 

Bắt đầu giao tác T2 (Begin Tran) 

Đọc giá khuyến mãi

Đọc giá khuyến mãi 

Cậ p nhật lại giá khuyến mãi 

Cậ p nhật lại giá khuyến mãi 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 66 

K ết thúc giao tác(Commit Tran)

K ết thúc giao tác(Commit Tran) 

d.  Nhận Xét:  Hai giao tác cùng cậ p nhật đồng thời trên cùng 1 tậ p dữ liệu nhưng

chỉ có 1 giao tác thực hiện thành công , dẫn đến tình trạng mất dữ liệu cậ p nhật

(lost update)

2. 

Trƣờ ng hợ p 2:

a.  Tình huống:

Hai giao tác T1, T2 thêm chi tiết đơn hàng cùng 1 thời điểm với cùng mã

Voucher (2 khách hàng cùng mua 1 Voucher tạ i 1 thời điểm)

b.  Mô Tả:

  Mô tả T1: T1 thêm chi tiết đơn hàng và cậ p nhật lại số lượng còn lại của

voucher A

  T1 nhận tham số đầu vào là @MaVoucher,@MaDonHang và

@SoLuong ( số lượ ng mua )

  Lấy số lượng còn lại của voucher A từ @Mavoucher gán vào

 biến @soluongconlai

   Nếu số lượng còn lại lớn hơn số lượng mua thì mới cho thêm chi

tiết đơn hàng 

  Tính thành tiền = Giá khuyến mãi * số lượ ng

  Số lượng còn lại = số lượng còn lại – số lượ ng mua

  Cậ p nhật số lượng còn lại cho voucher A

  Thêm chi tiết đơn hàng 

  Mô tả T2: T2 thêm chi tiết đơn hàng và cậ p nhật lại số lượng còn lại của

voucher A

  T1 nhận tham số đầu vào là @MaVoucher,@MaDonHang và

@SoLuong ( số lượ ng mua )

  Lấy số lượng còn lại của voucher A từ @Mavoucher gán vào

 biến @soluongconlai

 

 

Hệ Quản Trị Cơ SởDữ Liệu 67 

   Nếu số lượng còn lại lớn hơn hoặc bằng số lượng mua thì mớ i

cho thêm chi tiết đơn hàng 

  Tính thành tiền = Giá khuyến mãi * số lượ ng

  Số lượng còn lại = số lượng còn lại – số lượ ng mua

  Cậ p nhật số lượng còn lại cho voucher A

  Thêm chi tiết đơn hàng 

c. K ịch Bản:

T1

Mua Voucher A

T2

Mua Voucher A

Bắt đầu giao tác T1 ( Begin Tran)  

Bắt đầu giao tác T2 ( Begin Tran) 

Lấy số lượng còn lại của Voucher 

Lấy số lượng còn lại của Voucher 

Tính thành tiền cho CTĐH 2 

Tính thành tiền CTĐH 1 

Cậ p nhật số lượng còn lại Voucher A

Thêm CTĐH 1 vào bảng Chi tiết đơn hàng 

Cậ p nhật số lượng còn lại Voucher A

Thêm CTĐH 2 vào bảng Chi tiết đơn hàng 

K ết thúc Giao Tác T1 ( Commit Tran) 

K ết thúc Giao Tác T2 ( Commit Tran) 

d.  Nhận Xét: Hai giao tác cùng thêm chi tiết đơn hàng với Mã Voucher nhận vào

là như nhau (2 khách hàng cùng mua 1 Voucher), 2 giao tác cũng thực hiện trên

1đơn vị dữ liệu nhưng chỉ có 1 giao tác thực hiện thành công , dẫn đến tình 

tr ạng mất dữ liệu cậ p nhật (lost update) 

3. 

Trƣờ ng hợ p 3:

a.  Tình huống:

Giao tác T1 thực hiện cậ p nhật tỉ lệ khuyến mãi và chưa hoàn tất giao tác, trong

khi đó T2 thực hiện hành vi nạ p tiền, T2 thực hiện tính toán trên tỉ lệ khuyến

mãi của T1 vừa cậ p nhật, nhưng sau đó T1 rollback 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 68 

b.  Mô Tả:

  Mô tả T1: ( T1 cậ p nhật tỉ lệ khuyến mãi–  tỉ lệ khuyến mãi không đượ c

>100 và <0) 

  T1 nhận tham số đầu vào là tỉ lệ khuyến mãi và mệnh giá áp

dụng

  Thực hiện cậ p nhật các mệnh giá tương ứng vớ i @MenhGia vớ i

tỉ lệ khuyến mãi mớ i

  Tỉ lệ khuyến mãi không hợ  p lệ Rollback Tran

  Mô tả T2: T2 thực hiện hành vi nạ p thẻ cho khách hàng

   Nhận vào @MaKH , @Serrie và @Code

  Kiểm tra tính hợ  p lệ của thẻ 

  Lấy mệnh giá và tỉ lệ khuyến mãi của thẻ 

  Thực hiện thêm tiền cho khách hàng có mã là @MaKH vớ i số 

tiền = mệnh giá * tỉ lệ khuyến mãi 

  Cậ p nhật lại tình trạng của thẻ nạp (đã nạ p)

c. K ịch Bản:

T1

Cập nhật tỉ lệ khuyến mãi 

T2

Nạp thẻ 

Bắt đầu giao tác T1 ( Begin Tran)  

Cậ p nhật tỉ lệ khuyến mãi của thẻ nạ p

Bắt đầu giao tác T2 ( Begin Tran) 

Kiểm tra tính hợ  p lệ của thẻ 

Lấy mệnh giá và tỉ lệ khuyến mãi của thẻ

Thêm tiền cho khách hàng 

Kiểm tra tính hợ  p lệ của tỉ lệ khuyến mãi 

Tỉ lệ khuyến mãi không hợ  p lệ 

Hủy Giao Tác T1 ( Rollback Tran)  

Cậ p nhật lại tình trạng thẻ nạ p

K ết thúc Giao Tác T2 ( Commit Tran) 

d.  Nhận Xét: T2 đã đọc dữ liệu do T1 cậ p nhật trướ c khi T1 rollback  T2 đọc

dữ liệu rác (Dirty Read)

 

 

Hệ Quản Trị Cơ SởDữ Liệu 69 

4. 

Trƣờ ng hợ p 4:

a.  Tình huống:

Giao tác T1 thực hiện cậ p nhật giá khuyến mãi của Voucher mà khi cậ p nhật

giá khuyến mãi nhưng chưa hoàn tất việc ghi, trong khi đó T2 thực hiện thêm

vào chi tiết đơn hàng với giá khuyến mãi mà T1 vừa cậ p nhật, nhưng sau đó T1

rollback 

b.  Mô Tả:

  Mô tả T1:

   Nhận các tham số đầu vào 

  Cậ p nhật thông tin voucher  

  Chờ  giao tác T2 thực hiện

  Lấy giá gốc của @MaVoucher so sánh với giá khuyến mãi 

  Giá khuyến mãi không hợ  p lệ => T1 bị Rollback 

  Mô tả T2:

   Nhận các tham số đầu vào 

  Lấy số lượ ng của @MaVoucher gán cho @soluongconlai 

  Kiểm tra số lượ ng mua @MaVoucher:

o   Nếu số lượ ng mua <= @soluongconlai

o  Lấy giá khuyến mãi của @maVoucher 

o  Tính thành tiền

o  Cậ p nhật @soluongconlai của @voucher 

o  Thêm chi tiết đơn hàng

c. K ịch Bản:

T1

Cập nhật thông tin Voucher

T2

Thêm chi tiết đơn hàng 

Bắt đầu giao tác (Begin Tran) 

Bắt đầu giao tác (Begin Tran) 

Thực hiện cậ p nhật thông tin Voucher (cậ p

nhật giá khuyến mãi) 

Đọc số lượ 0ng còn lại của Voucher 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 70 

Cậ p nhật số lượng còn lại của Voucher 

Thêm chi tiết đơn hàng 

Hủy giao tác (Rollback tran)

K ết thúc giao tác (Commit tran)  

d.  Nhận xét: Giao tác T1 thực hiện việc cậ p nhật lại giá khuyến mãi , trong khi đó

giao tác T2 đọc giá khuyến mãi mà T1 vừa cậ p nhật để tính thành tiền thêm

vào chi tiết đơn hàng.  Nhưng  giá khuyến mãi mà T1 cậ p nhật lại lớn hơn giá

gốc nên T1 bị R ollback làm cho T2 đọc sai dữ liệu =>Dirty Read 

5. 

Trƣờ ng hợ p 5:

a.  Tình huống:

Giao tác T1 thực hiện hành vi nạ p thẻ ,trong khi T2 đó cũng thực hiện hành vi

nạ p thẻ ( 2 khách hàng khác nhau cùng nạ p chung 1 thẻ cùng 1 thời điểm)

b.  Mô Tả:

  Mô tả T1:

   Nhận tham số @MaKH, @Series , @Code

  Kiểm tra thẻ nạ p hợ  p lệ 

   Nếu thẻ nạ p hợ  p lệ, thực hiện lấy Mã tài khoản theo của khách

hàng 

  Thực hiện cộng thêm tiền vào tài khoản cho khách hàng 

  Mô tả T2:

   Nhận tham số @MaKH, @Series , @Code

  Kiểm tra thẻ nạ p hợ  p lệ 

   Nếu thẻ nạ p hợ  p lệ, thực hiện lấy Mã tài khoản theo @MaKH

  Thực hiện cộng thêm tiền vào tài khoản cho khách hàng 

c. K ịch Bản:

T1

Thự c hiện nạp thẻ 

T2

Thự c hiện nạp thẻ 

Bắt đầu giao tác (Begin Tran) 

Bắt đầu giao tác ( Begin Tran) 

Kiểm tra tính thẻ hợ  p lệ của thẻ nạ p

Lấy thông tin thẻ nạ p

 

 

Hệ Quản Trị Cơ SởDữ Liệu 71 

Kiểm tra tính thẻ hợ  p lệ của thẻ nạ p

Lấy thông tin thẻ nạ p

Cậ p nhật lại thông tin thẻ nạ p

Cộng thêm tài khoản cho khách hàng 

Cậ p nhật lại thông tin thẻ nạ p

Cộng thêm tài khoản cho khách hàng 

K ết thúc giao tác (Commit Tran) 

K ết thúc giao tác (Commit Tran) 

d.  Nhận Xét: 2 giao tác T1 và T2 cùng thực hiện hành vi nạ p thẻ nhưng chỉ có 1

giao tác thực hiện thành công = > xảy ra lỗi Lost update 

6.  Trƣờ ng hợ p 6:

a. 

Tình huống:

Giao tác T1 thực hiện hành vi tìm kiếm Voucher có giá trong khoảng từ 

MucGia1 đến MucGia2, trong khi đó giao tác T2 thực hiện thêm (hoặc cậ p

nhật) Voucher cũng có giá trong khoảng từ MucGia1 đến MucGia2.

  Giao tác T1 đọc số lượng Voucher có giá trong khoảng từMucGia1 đến

MucGia2

  Giao tác T2 thực hiện thêm (hoặc cậ p nhật) Voucher 

  Giao tác T1 load danh sách Voucher tìm đượ c

b. 

Mô Tả:

  Mô tả T1:

   Nhận tham số @MucGia1, @MucGia2 , @Soluong output 

  Thực hiện lấy số lượ ng sản phẩm

  Thực hiện lấy danh sách sản phẩm tìm đượ c

  K ết thúc giao tác 

  Mô tả T2:

   Nhận tham số các tham số đầu vào (thông tin Voucher) 

  Thực hiện thêm (hoặc cậ p nhật) vào cơ sở dữ liệu

  K ết thúc giao tác 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 72 

c. K ịch Bản:

T1

Tìm kiếm Voucher 

T2

Thêm (hoặc cập nhật) Voucher 

Bắt đầu giao tác (Begin Tran) 

Bắt đầu giao tác (Begin Tran) 

Đọc số lượ ng Voucher thỏa tiêu chí 

Thực hiện thêm (hoặc cậ p nhật)

Voucher mới vào cơ sở dữ liệu

K ết thúc giao tác (Commit Tran) 

Lấy danh sách Voucher thỏa tiêu chí 

K ết thúc giao tác (Commit Tran) 

d.  Nhận xét:Danh sách Voucher T1 đọc đượ c sẽ nhiều hơn số lượng mà T1 đã đọc

trước đó, dữ liệu không nhất quán (lỗi Phantom)

7.  Trƣờ ng hợ p 7:

a.  Tình huống:

Giao tác T1 thực hiện hành vi tìm kiếm Voucher theo 1 Từ khóa nào đó (tìm

kiếm theo tên), trong khi đó giao tác T2 thực hiện thêm (hoặc cậ p nhật)

Voucher cũng có tên chứa từ đó. 

 Giao tác T1 đọc số lượng Voucher có tên cần tìm 

 Giao tác T2 thực hiện thêm (hoặc cậ p nhật) Voucher 

 Giao tác T1 load danh sách Voucher tìm đượ c

b.  Mô Tả:

  Mô tả T1:

   Nhận tham số @Ten , @Soluong output 

  Thực hiện lấy số lượ ng sản phẩm

  Thực hiện lấy danh sách sản phẩm tìm đượ c

  K ết thúc giao tác 

  Mô tả T2:

   Nhận tham số các tham số đầu vào (thông tin Voucher) 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 73 

  Thực hiện thêm (hoặc cậ p nhật) Voucher  vào cơ sở dữ liệu

  K ết thúc giao tác 

c. K ịch Bản:

T1

Tìm kiếm Voucher 

T2

Thêm (hoặc cập nhật) Voucher 

Bắt đầu giao tác (Begin Tran) 

Bắt đầu giao tác (Begin Tran) 

Đọc số lượ ng Voucher thỏa tiêu chí 

Thực hiện thêm (hoặc cậ p nhật)

Voucher mới vào cơ sở dữ liệu

K ết thúc giao tác (Commit Tran) 

Lấy danh sách Voucher thỏa tiêu chí 

K ết thúc giao tác (Commit Tran) 

d.  Nhận xét:  Danh sách Voucher T1 đọc đượ c sẽ nhiều hơn số lượng mà T1 đã

đọc trướ c đó, dữ liệu không nhất quán (lỗi Phantom)

8.  Trƣờng hơp 8: 

a. 

Tình huống: 

Giao tác T1 thực hiện lấy danh sách các hợp đồng vẫn còn thờ i hạn , trong khi

đó Giao tác T2 thực hiện thêm 1 hợp đồng mớ i 

  T1 đọc số lượ ng hợp đồng vẫn còn thờ i hạn 

  T2 thực hiện thêm hợ  p đồng mớ i 

  T1 lấy danh sách hợp đồng vẫn còn thờ i hạn 

b.  Mô tả: 

  Mô tả T1: 

  Đọc số lượ ng hợp đồng vẫn còn thờ i hạn 

  Lấy danh sách hợp đồng vẫn còn thờ i hạn 

  K ết thúc giao tác 

  Mô tả T2: 

   Nhận tham số đầu vào (thông tin hợp đồng) 

  Thực hiện thêm vào cơ sở dữ liệu 

  K ết thúc giao tác 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 74 

c. K ịch bản:

T1

Đọc số lƣợng và lấy danh sách hợ p

đồng vẫn còn thờ i hạn

T2

Thêm hợp đồng mớ i

Bắt đầu giao tác (Begin Tran) 

Đọc số lượ ng hợp đồng vẫn còn thờ i

hạn

Bắt đầu giao tác (Begin Tran) 

Thực hiện thêm hợp đồng vào cơ sở  

dữ liệu

K ết thúc giao tác (Commit Tran) 

Lấy danh sách hợp đồng vẫn còn thờ i

hạn

K ết thúc giao tác (Commit Tran) 

d.  Nhận xét: Danh sách hợp đồng T1 lấy đượ c sẽ nhiều hơn số lượng đã đọc

trước đó => dữ liệu không nhất quán (lỗi phantom)

9.  Trƣờng hơp 9: 

a.  Tình huống:

Giao tác T1 thực hiện lấy danh sách các hợp đồng hết thờ i hạn , trong khi đó

Giao tác T2 thực hiện cậ p nhật lại tr ạng thái hợp đồng (đã hết hạn) 

  T1 đọc số lượ ng hợp đồng hết thờ i hạn 

  T2 thực cậ p nhật lại tr ạng thái hợp đồng

  T1 lấy danh sách hợp đồng hết thờ i hạn 

b. 

Mô tả: 

  Mô tả T1: 

  Đọc số lượ ng hợp đồng hết thờ i hạn 

  Lấy danh sách hợp đồng hết thờ i hạn 

  K ết thúc giao tác 

  Mô tả T2: 

   Nhận tham số đầu vào (thông tin hợp đồng) 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 75 

  Thực hiện cậ p nhật lại tr ạng thái hợp đồng thành hết thờ i hạn 

  K ết thúc giao tác 

c. K ịch bản:

T1

Đọc số lƣợng và lấy danh sách hợ p

đồng hết thờ i hạn

T2

Cập nhật lại tình trạng hợp đồng

Bắt đầu giao tác (Begin Tran) 

Đọc số lượ ng hợp đồng hết thờ i hạn

Bắt đầu giao tác (Begin Tran) 

Thực hiện cậ p nhật lại tr ạng thái hợ  p

đồng

K ết thúc giao tác (Commit Tran) 

Lấy danh sách hợp đồng hết thờ i hạn

K ết thúc giao tác (Commit Tran) 

d.  Nhận xét: Danh sách hợp đồng T1 lấy đượ c sẽ nhiều hơn số lượng đã đọc

trước đó => dữ liệu không nhất quán (lỗi phantom)

10. Trƣờ ng hợ p 10:

a.  Tình huống:

Giao tác T1 thực hiện hành vi tìm kiếm Voucher có giá trong khoảng từ 

MucGia1 đến MucGia2, trong khi đó giao tác T2 thực hiện cậ p nhật Voucher 

(đang có giá trong khoảng từ MucGia1 đến MucGia2) mà sau khi cậ p nhật thì

giá không còn nằm trong khoảng MucGia1 đến MucGia2 nữa

  Giao tác T1 đọc số lượng Voucher có giá trong khoảng từ MucGia1 đến

MucGia2

  Giao tác T2 thực hiện cậ p nhật giá Voucher  

  Giao tác T1 load danh sách Voucher tìm đượ c

b. 

Mô Tả:

  Mô tả T1:

   Nhận tham số @MucGia1, @MucGia2 , @Soluong output 

  Thực hiện lấy số lượ ng sản phẩm

 

 

Hệ Quản Trị Cơ SởDữ Liệu 76 

  Thực hiện lấy danh sách sản phẩm tìm đượ c

  K ết thúc giao tác 

  Mô tả T2:

   Nhận tham số các tham số đầu vào (thông tin Voucher) 

  Thực hiện cậ p nhậtVoucher 

  K ết thúc giao tác 

c. K ịch Bản:

T1

Tìm kiếm Voucher 

T2

Thêm (hoặc cập nhật) Voucher 

Bắt đầu giao tác (Begin Tran) 

Bắt đầu giao tác (Begin Tran) 

Đọc số lượ ng Voucher thỏa tiêu chí 

Thực hiện cậ p nhật Voucher 

K ết thúc giao tác (Commit Tran) 

Lấy danh sách Voucher thỏa tiêu chí 

K ết thúc giao tác (Commit Tran) 

d.  Nhận xét:  Danh sách Voucher  T1 đọc đượ c sẽ ít hơn số lượng mà T1 đã đọc

trước đó, dữ liệu không nhất quán => lỗi Unrepeatable Read 

11. Trƣờ ng hợ p 11:

a. 

Tình huống:

Giao tác T1 thực hiện hành vi nạ p thẻ ,trong khi T2 đó cũng thực hiện hành vi

nạ p thẻ ( 2 khách hàng khác nhau cùng nạ p chung 1 thẻ cùng 1 thời điểm)

b. 

Mô Tả:

  Mô tả T1:

   Nhận tham số @MaKH, @Series , @Code

  Kiểm tra thẻ nạ p hợ  p lệ 

   Nếu thẻ nạ p hợ  p lệ, thực hiện lấy Mã tài khoản theo của khách

hàng 

  Thực hiệnhiện cộng thêm tiền vào tài khoản cho khách hàng 

  Mô tả T2:

   Nhận tham số @MaKH, @Series , @Code

  Kiểm tra thẻ nạ p hợ  p lệ 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 77 

   Nếu thẻ nạ p hợ  p lệ, thực hiện lấy Mã tài khoản theo @MaKH

  Thực hiện hiện cộng thêm tiền vào tài khoản cho khách hàng 

c. K ịch Bản:

T1

Thự c hiện nạp thẻ 

T2

Thự c hiện nạp thẻ 

Bắt đầu giao tác (Begin Tran) 

Bắt đầu giao tác (Begin Tran) 

Kiểm tra tính thẻ hợ  p lệ của thẻ nạ p

Kiểm tra tính thẻ hợ  p lệ của thẻ nạ p

Lấy thông tin thẻ nạ p

Cậ p nhật lại thông tin thẻ nạ p

Cộng thêm tài khoản cho khách hàng 

Lấy thông tin thẻ nạ p

Cậ p nhật lại thông tin thẻ nạ p

Cộng thêm tài khoản cho khách hàng 

K ết thúc giao tác (Commit Tran) 

K ết thúc giao tác (Commit Tran) 

d.  Nhận Xét:  T1 đọc giá trị lỗi thờ i ở  đơn vị dữ liệu tr ạng thái do T2 cậ p nhật dẫn đến

T1 nạ p thẻ hợ  p lệ nhưng không được công tiền trong tài khoản => lỗi Unrepeatable

Read 

4.3    Mô tả gi ải pháp xử  lí  

1.  Trƣờ ng hợ p 1: 

a.  Giải quyết:

- Sử dụng mức cô lập Repeatable Read và Lock hints (updlock) để giải quyết

- Giải thích :

o  Cả 2 giao tác ban đầu sẽ đọc cùng 1 đơn vị dữ liệu(giả sử gọi là đơn vị 

dữ liệu A) cùng 1 thời điểm( trên cùng 1 mã Voucher) = > cả 2 giao tác

cùng giữ Shared Lock 

o  Sử dụng mức cô lập Repeatable Read để  cho phép T1 và T2 có thể ghi

trên dữ liệu thỏa điều kiện đang có Shared Lock (trên A) 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 78 

o  Sau đó T1 muốn thực hiện ghi trên A cần phải xin Exclusive Lock 

nhưng lúc này T2 đang giữ  Shared Lock trên A và cũng muốn thực

hiện ghi A nên không thể nhả Shared Lock để hệ quản tr ị cấ p Exclusive

Lock cho T1 được = > 2 giao tác rơi vào tình trạng chờ  đợ i lẫn nhau (

chờ   bên kia nhả khóa) => xảy ra deadlock.

o  Sử dụng Updlock để nâng cấ p từ Shared Lock lên Exclusive Lock, tại 1

thời điểm chỉ có 1 Updlock được phát trên 1 đơn vị dữ liệu nên sẽ đảm

 bảo đượ c việc giao tác này có thể nâng cấp Shared Lock lên Exclusive

Lock mà không cần phải chờ  giao tác kia nhả khóa. 

=> đảm bảo tính đúng đắn cho 2 giao tác thực hiện thành công việc cậ p

nhật thông tin trên cùng 1 Voucher tại cùng 1 thời điểm

 b.  Xử lý tại Stored Procedure:

T1 T2

create  proc sp_GiamGiaKhuyenMai_fix

@MaVoucher int,

@GiaGiam decimal

as

 begin

 begin tran

set transaction isolation level 

repeatable read

declare @GiaKhuyenMai

decimal

select @GiaKhuyenMai = 

GiaKhuyenMai from Voucher with

(updlock ) where MaVoucher = 

@MaVoucher 

set @GiaKhuyenMai = 

@GiaKhuyenMai + @GiaGiam

waitfor  delay '00:00:15' 

create  proc sp_GiamGiaKhuyenMai_fix

@MaVoucher int,

@GiaGiam decimal

as

 begin

 begin tran

set transaction isolation level 

repeatable read

declare @GiaKhuyenMai

decimal

select @GiaKhuyenMai = 

GiaKhuyenMai from Voucher with

(updlock ) where MaVoucher = 

@MaVoucher 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 79 

set @GiaKhuyenMai = 

@GiaKhuyenMai + @GiaGiam

waitfor  delay '00:00:15'

update Voucher 

set GiaKhuyenMai = 

@GiaKhuyenMai where MaVoucher = 

@MaVoucher 

if (@@ERROR  <>0)

 begin

 print  N'Giao tác bị lỗi'

rollback  tran

return

end 

commit tran

end

go 

update Voucher 

set GiaKhuyenMai = 

@GiaKhuyenMai where MaVoucher = 

@MaVoucher 

if (@@ERROR  <>0)

 begin

 print  N'Giao tác bị lỗi'

rollback  tran

return

end 

commit tran

end

go 

2.  Trƣờ ng hợ p 2: 

a.  Giải quyết:

- Sử dụng mức cô lâp Repeatable Read và Lock hints (updlock) để giải quyết

- Giải thích :

o  Cả 2 giao tác ban đầu sẽ đọc cùng 1 đơn vị dữ liệu (số lượng còn lại của

Voucher, giả sử gọi là đơn vị dữ liệu A) cùng 1 thời điểm ( trên cùng 1

mã Voucher) = > cả 2 giao tác cùng giữ Shared Lock trên A 

o  Sử dụng cô lập Repeatable Read để cho phép T1 và T2 có thể ghi trên

dữ liệu thỏa điều kiện đang có Shared Lock (dữ liệu A)

o  Sau đó T1 muốn thực hiện ghi trên A cần phải xin Exclusive Lock 

nhưng lúc này T2 đang giữ Shared Lock và cũng muốn thực hiện ghi

 

 

Hệ Quản Trị Cơ SởDữ Liệu 80 

trên A nên không thể nhả Shared Lock để hệ quản tr ị cấ p Exclusive

Lock cho T1 được = > 2 giao tác rơi vào tình trạng chờ  đợ i lẫn nhau (

chờ   bên kia nhả khóa) => xảy ra deadlock.

o  Sử dụng Updlock để nâng cấ p từ Shared Lock lên Exclusive Lock, tại 1

thời điểm chỉ có 1 Updlock được phát trên 1 đơn vị dữ liệu nên sẽ đảm

 bảo đượ c việc giao tác này có thể nâng cấp Shared Lock lên Exclusive

Lock mà không cần phải chờ  giao tác kia nhả khóa. 

=>Đảm bảo tính hợ  p lệ và nhất quán dữ liệu khi 2 khách hàng cùng mua

1 Voucher tại cùng 1 thời điểm

 b.  Xử lý tại Stored Procedure:

T1 T2

create  proc sp_ThemChiTietDonHang_fix

@MaDonHang int,

@MaVoucher int,

@SoLuong int,

@flag int output -- biến kiểm tra có thêmđượ c hay ko?

as

 begin

 begin tran

set transaction isolation level 

repeatable read

declare @soluongconlai int

select @soluongconlai=SoLuong

from Voucher  with(updlock ) where 

MaVoucher =@MaVoucher 

waitfor  delay '00:00:05' 

create  proc sp_ThemChiTietDonHang_fix

@MaDonHang int,

@MaVoucher int,

@SoLuong int,

@flag int output -- biến kiểm tra có thêmđượ c hay ko?

as

 begin

 begin tran

set transaction isolation level 

repeatable read

declare @soluongconlai int

select @soluongconlai=SoLuong

from Voucher  with(updlock ) where 

MaVoucher =@MaVoucher 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 81 

waitfor  delay '00:00:05' 

if (@SoLuong<=@soluongconlai)

 begin

declare 

@GiaKhuyenMai decimal

set @GiaKhuyenMai = 

(select GiaKhuyenMai from Voucher where 

MaVoucher = @MaVoucher )

declare @ThanhTien

decimal

set @ThanhTien = 

@GiaKhuyenMai * @SoLuong

---cap nhat lai so luong

con lai cua voucher 

update Voucher set 

SoLuong=@soluongconlai-@SoLuong

where MaVoucher =@MaVoucher 

--Them chi tiet don

hang

insert into 

ChiTietDonHang(MaDonHang,MaVoucher ,S

oLuong,ThanhTien) values

(@MaDonHang,@MaVoucher ,@SoLuong,

@ThanhTien)

set @flag = 1

end

else -- @SoLuong > @soluongconlai

 begin

 print  N'số lượng Voucher cònlại không đủ '

set @flag = -1

end

if (@@ERROR  <>0)

 begin

 print 'Giao tác bị lỗi'

rollback  tran

return

end 

commit tran 

end

go 

if (@SoLuong<=@soluongconlai)

 begin

declare 

@GiaKhuyenMai decimal

set @GiaKhuyenMai = 

(select GiaKhuyenMai from Voucher where 

MaVoucher = @MaVoucher )

declare @ThanhTien

decimal

 

 

Hệ Quản Trị Cơ SởDữ Liệu 82 

set @ThanhTien = 

@GiaKhuyenMai * @SoLuong

---cap nhat lai so luong

con lai cua voucher 

update Voucher set 

SoLuong=@soluongconlai-@SoLuong

where MaVoucher =@MaVoucher 

--Them chi tiet don

hang

insert into 

ChiTietDonHang(MaDonHang,MaVoucher ,S

oLuong,ThanhTien) values

(@MaDonHang,@MaVoucher ,@SoLuong,

@ThanhTien)

set @flag = 1

end

else -- @SoLuong > @soluongconlai

 begin

 print  N'số lượng Voucher cònlại không đủ '

set @flag = -1

end

if (@@ERROR  <>0)

 begin

 print 'Giao tác bị lỗi'

rollback  tran

return

end 

commit tran 

end

go

3.  Trƣờ ng hợ p 3: 

a.  Giải quyết :

- Sử dụng mức cô lập Read Committed cho giao tác T2 

- Giải thích:

o  T1 cậ p nhật tỉ lệ khuyến mãi và T2 đọc tỉ lệ khuyến mãi trên cùng 1 Thẻ 

nạ p tại cùng 1 thời điểm => T1, T2 cùng thực hiện thao tác trên cùng 1

đơn vị dữ liệu tại cùng 1 thời điểm (giả sử gọi là đơn vị dữ liệu A)

o  Khi T1 thực hiện ghi (update lại tỉ lệ khuyến mãi) và chưa kết thúc giao

tác, tức là T1 đang giữ Exclusive Lock trên đơn vị dữ liệu A

o  Tiế p theo T2 thực hiện đọc trên đơn vị dữ liệu A, do T2 đang ở mức cô

lập Read Committed nên sẽ phải xin Shared Lock trên A, mà T1 đang giữ 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 83 

Exclusive Lock nên T2 không thể xin được Shared Lock cho đến khi T1

hoàn tất việc ghi trên A(Commit) 

o  T2 chỉ đọc được A khi T1 đã Commit => đảm bảo tính đúng đắn của dữ 

liệu T2 đọc đượ c

 b.  Xử lý tại Stored Procedure:

T1

Cập nhật tỉ lệ khuyến mãi 

T2

Nạp thẻ 

create  proc sp_KhuyenMai

@MenhGia decimal(18,0),---menh gia dc

ap dung khuyen mai

@TileKM int---tile khuyen mai

AS

BEGIN

 begin tran 

set transaction isolation level read 

uncommitted

UPDATE TheNap SET 

TiLeKhuyenMai=@TileKM WHERE 

MenhGia=@MenhGia and TrangThai=1

 

waitfor  delay '00:00:12' 

create  proc sp_NapThe_fix_3

@MaKH int,

@Series varchar (50),

@Code varchar (50),

@flag int output

AS

BEGIN

set transaction isolation level read 

committed 

EXEC sp_KiemTraTheNap  

@Series,@Code,@flag output---kiem tra the

IF(@flag<>0)---neu the hop le

Begin

 begin tran

--lay trang thai the nap

declare @TrangThai int

select @TrangThai = 

TrangThai from TheNap where Series = 

@Series and Code = @Code

waitfor  delay '00:00:05'

if (@TrangThai = 1)

 begin

declare @matk 

int ---lay ra ma tai khoan tu ma khach hang

 

 

Hệ Quản Trị Cơ SởDữ Liệu 84 

EXEC 

sp_LayIDTaiKhoanTheNap  @MaKH,@matk 

output

---cap nhat bang

the nap ve ngay nap va ma khach hang da nap

the , va ngung hoat dong the

declare 

@menhgia decimal(18,0)

declare @tilekm

int

----Lay ra menh

gia va ti le khuyen mai cua the vua nap

Select 

@menhgia=MenhGia,@tilekm=TiLeKhuyen

Mai from TheNap where MaTheNap=@flag

set @menhgia = 

@menhgia+(@menhgia * @tilekm)/100 --

tinh lai menh gia the nap co khuyen mai

----Thuc hien

cong tien cho tai khoan

EXEC 

sp_ThemTientaiKhoanTheNap  

@MaKH,@menhgia

Update TheNap

set 

MaTaiKhoan=@matk , NgayNap=GETDATE(

),TrangThai=0 where MaTheNap=@flag

end

if (@TileKM <0 or @TiLeKM > 100)

 begin

raiserror ('Tỉ lệ không hợ  plệ',1,0)

rollback  tran

return

end

if (@@ERROR  <>0 )

 begin

 print  N'Giao tác bị lỗi'

rollback  tran

return

end

commit tran

END

GO 

if (@@ERROR  <>0)

 begin

 print  N'Giao tác bị lỗi'

 

 

Hệ Quản Trị Cơ SởDữ Liệu 85 

rollback  tran

return

end

commit tran

END

END

go 

4.  Trƣờ ng hợ p 4: 

a.  Giải quyết :

- Sử dụng mức cô lập Read Committed cho giao tác T2 

- Giải thích:

o  T1 cậ p nhật giá khuyến mãi và T2 đọc giá khuyến mãi( thêm chi tiết đơn

hàng) trên cùng 1 Voucher cùng 1 thời điểm => T1, T2 cùng thực hiện

thao tác trên cùng 1 đơn vị dữ liệu tại cùng 1 thời điểm (giả sử gọi là đơn

vị dữ liệu A)

o  Khi T1 thực hiện ghi (update lại giá khuyến mãi) và chưa kết thúc giao

tác, tức là T1 đang giữ Exclusive Lock trên đơn vị dữ liệu A

o  Tiế p theo T2 thực hiện đọc (đọc giá khuyến mãi) trên đơn vị dữ liệu A, do

T2 đang ở mức cô lập Read Committed nên sẽ phải xin Shared Lock trên

A, mà T1 đang giữ Exclusive Lock trên A nên T1 không thể xin đượ c

Shared Lock cho đến khi T1 hoàn tất việc ghi trên A(Commit) 

o  T2 chỉ đọc được A khi T1 đã Commit => đảm bảo tính đúng đắn của dữ 

liệu T2 đọc đượ c

 b.  Xử lý tại Stored Procedure:

T1 T2

create  proc sp_SuaVoucher 

@MaVoucher int,

@TenVoucher nvarchar (200),

@ThongTinChiTiet nvarchar (200),

@NgayBatDau datetime,

@NgayKetThuc datetime,

@GiaGoc decimal,

@GiaKhuyenMai decimal,

@SoLuong int,

 

 

Hệ Quản Trị Cơ SởDữ Liệu 86 

@TrangThai int,

@UrlHinh nvarchar (100)

as

 begin tran

set transaction isolation level read 

uncommitted 

update Voucher 

set TenVoucher = 

@TenVoucher ,ThongTinChiTiet = 

@ThongTinChiTiet, NgayBatDau = 

@NgayBatDau, NgayKetThuc = 

@NgayKetThuc,

GiaGoc = 

@GiaGoc,GiaKhuyenMai = 

@GiaKhuyenMai,SoLuong = 

@SoLuong,TrangThai = 

@TrangThai,UrlHinh = @UrlHinh

where MaVoucher = 

@MaVoucher 

waitfor  delay '00:00:15' 

create  proc 

sp_dirty_ThemChiTietDonHang_fix

@MaDonHang int,

@MaVoucher int,

@SoLuong int,

@flag int output

as

 begin tran

SET TRANSACTION ISOLATION 

LEVEL READ COMMITTED

declare @soluongconlai int

select @soluongconlai=SoLuong

from Voucher where 

MaVoucher =@MaVoucher 

--waitfor delay '00:00:05'

if (@SoLuong<=@soluongconlai)

 begin

declare 

@GiaKhuyenMai decimal

set 

@GiaKhuyenMai = (select 

GiaKhuyenMai from Voucher where 

MaVoucher = @MaVoucher ) 

declare 

@ThanhTien decimal

set @ThanhTien = 

@GiaKhuyenMai * @SoLuong

---cap nhat lai so

luong con lai cua voucher 

update Voucher set 

SoLuong=@soluongconlai-@SoLuong

where MaVoucher =@MaVoucher 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 87 

--Them chi tiet don

hang

insert into

ChiTietDonHang(MaDonHang,MaVouch

er ,SoLuong,ThanhTien) values

(@MaDonHang,@MaVoucher ,@SoLuon

g,@ThanhTien)

set @flag = 1

end

else--@SoLuong >

@soluongconlai

 begin 

 print  N'Số lượ ng

voucher còn lại không đủ '

set @flag = -1

end 

if (@GiaKhuyenMai > @GiaGoc)

 begin 

raiserror ('Loi',1,0)

rollback  tran

return

end 

if (@@ERROR  <> 0)

 begin

 print  N'Giao tac bi loi'

rollback  tran

return

end

commit tran

go

if (@@ERROR  <> 0)

 begin

 print  N'Gia tác bị lỗi'

rollback  tran

return

end

commit tran

go

5.  Trƣờ ng hợ p 5: 

a.  Giải quyết:

- Sử dụng mức cô lập Repeatable Read và Lock hints (updlock) để giải quyết

- Giải thích :

o  Cả 2 giao tác ban đầu sẽ đọc cùng 1 đơn vị dữ liệu cùng 1 thời điểm

(đọc tr ạng thái thẻ nạp trên trên cùng 1 mã Thẻ nạ p ) = > cả 2 giao tác

 

 

Hệ Quản Trị Cơ SởDữ Liệu 88 

cùng thao tác trên 1 đơn vị dữ liệu (giả sử gọi là A) nên T1,T2 cùng giữ 

Shared Lock trên A 

o  Sử dụng cô lập Repeatable Read để cho phép T1 và T2 có thể ghi trên

dữ liệu thỏa điều kiện đang có Shared Lock (trên A) 

o  Sau đó T1 muốn thực hiện ghi trên A cần phải xin Exclusive Lock 

nhưng lúc này T2 đang giữ  Shared Lock và cũng muốn thực hiện ghi

A nên không thể nhả Shared Lock để hệ quản tr ị cấ p Exclusive Lock 

cho T1 được = > 2 giao tác rơi vào tình trạng chờ  đợ i lẫn nhau ( chờ   bên

kia nhả khóa) => xảy ra deadlock.

o  Sử dụng cô lập Repeatable Read để cho phép T1 và T2 có thể ghi trên

dữ liệu thỏa điều kiện đang có Shared Lock (trên A) 

o  Sử dụng Updlock để nâng cấ p từ Shared Lock lên Exclusive Lock, tại 1

thời điểm chỉ có 1 Updlock được phát trên 1 đơn vị dữ liệu nên sẽ đảm

 bảo đượ c việc giao tác này có thể nâng cấp Shared Lock lên Exclusive

Lock mà không cần phải chờ  giao tác kia nhả khóa. 

=> đảm bảo tính hợ  p lệ cho trườ ng hợp 2 khách hàng cùng nạ p chung 1

thẻ nạ p tại cùng 1 thời điểm

 b.  Xử lý tại Stored Procedure:

T1 T2

create  proc sp_NapThe_fix

@MaKH int,

@Series varchar (50),

@Code varchar (50),

@flag int output

AS

BEGIN tran 

EXEC sp_KiemTraTheNap  

@Series,@Code,@flag output---kiem tra the

IF(@flag<>0)---neu the hop le

 begin --tran

set transaction isolation level 

repeatable read

--lay trang thai the nap

declare @TrangThai int

select @TrangThai = TrangThai

from TheNap with(updlock ) where Series = 

@Series and Code = @Code

 

 

Hệ Quản Trị Cơ SởDữ Liệu 89 

waitfor  delay '00:00:05'

create  proc sp_NapThe_fix

@MaKH int,

@Series varchar (50),

@Code varchar (50),

@flag int output

AS

BEGIN tran 

EXEC sp_KiemTraTheNap  

@Series,@Code,@flag output---kiem tra the

IF(@flag<>0)---neu the hop le

 begin --tran

set transaction isolation level 

repeatable read

--lay trang thai the nap

declare @TrangThai int

select @TrangThai = TrangThai

from TheNap with(updlock ) where Series = 

@Series and Code = @Code

waitfor  delay '00:00:05'

if (@TrangThai = 1)

 begin

declare @matk int ---

lay ra ma tai khoan tu ma khach hang

EXEC 

sp_LayIDTaiKhoanTheNap  @MaKH,@matk 

output

---cap nhat bang the

nap ve ngay nap va ma khach hang da nap

the , va ngung hoat dong the

declare @menhgia

decimal(18,0)

declare @tilekm int

----Lay ra menh gia va

ti le khuyen mai cua the vua nap

Select 

@menhgia=MenhGia,@tilekm=TiLeKhuyen

Mai from TheNap where MaTheNap=@flag

set @menhgia = 

@menhgia+(@menhgia * @tilekm)/100 --

tinh lai menh gia the nap co khuyen mai

----Thuc hien cong tien

cho tai khoan

EXEC 

sp_ThemTientaiKhoanTheNap  

@MaKH,@menhgia

Update TheNap set 

MaTaiKhoan=@matk , NgayNap=GETDATE

(),TrangThai=0 where MaTheNap=@flag

end

else

 

 

Hệ Quản Trị Cơ SởDữ Liệu 90 

 begin

set @flag=0

end

end

if (@TrangThai = 1)

 begin

declare @matk int ---

lay ra ma tai khoan tu ma khach hang

EXEC 

sp_LayIDTaiKhoanTheNap  @MaKH,@matk 

output

---cap nhat bang the

nap ve ngay nap va ma khach hang da nap

the , va ngung hoat dong the

declare @menhgia

decimal(18,0)

declare @tilekm int

----Lay ra menh gia va

ti le khuyen mai cua the vua nap

Select 

@menhgia=MenhGia,@tilekm=TiLeKhuyen

Mai from TheNap where MaTheNap=@flag

set @menhgia = 

@menhgia+(@menhgia * @tilekm)/100 --

tinh lai menh gia the nap co khuyen mai

----Thuc hien cong tien

cho tai khoan

EXEC 

sp_ThemTientaiKhoanTheNap  

@MaKH,@menhgia

Update TheNap set 

MaTaiKhoan=@matk , NgayNap=GETDATE

(),TrangThai=0 where MaTheNap=@flag

end

else

 begin

set @flag=0

end

end

if (@@ERROR  <>0)

 begin

 print  N'Giao tác bị lỗi'

rollback  tran

return

end 

commit tran 

go

if (@@ERROR  <>0)

 

 

Hệ Quản Trị Cơ SởDữ Liệu 91 

 begin

 print  N'Giao tác bị lỗi'

rollback tran

return

end 

commit tran 

go

6.  Trƣờ ng hợ p 6: 

a.  Giải quyết:

- Sử dụng mức cô lập Serializable cho giao tác T1 để giải quyết

- Giải thích : 

o  Ban đầu T1 thực hiện đếm số lượng Voucher có giá từ MucGia1 đến

MucGia2 (giả sử gọi là đơn vị dữ liệu A) => T1 giữ Shared Lock trên A 

o  T1 đang ở mức cô lập Serializable thì sẽ giữ Shared Lock cho đến hết

giao tác và sẽ ngăn cản việc insert dữ liệu thỏa điều kiện thiết lậ p Shared

Lock (ngăn cản việc insert Voucher có giá từ  MucGia1 đến MucGia2 vì

T1 đang giữ Shared Lock trên A). Do vậy, T2 không thể thực hiện việc

insert Voucher có giá từ MucGia1 đến MucGia2 cho đến khi T1 k ết thúc

(Commit)

=>đảm bảo tính đồng nhất dữ liệu

 b.  Xử lý tại Stored Procedure:

T1

Tìm kiếm

T2

Thêm Voucher 

create  proc sp_TimKiemTheoGia_fix

@MucGia1 decimal,

@MucGia2 decimal,

@soluong int output

as

 begin

 begin tran

set transaction isolation level 

serializable

set @soluong = (select 

COUNT(*) from Voucher where 

GiaKhuyenMai between @MucGia1

and @MucGia2 and TrangThai = 1)

waitfor  delay '00:00:10' 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 92 

create  proc sp_ThemVoucher 

@TenVoucher nvarchar (200),

@ThongTinChiTiet nvarchar (200),

@NgayBatDau datetime,

@NgayKetThuc datetime,

@GiaGoc decimal,

@GiaKhuyenMai decimal,

@SoLuong int,

@MaLoaiHinhDV int,

@MaDoanhNghiep int,

@UrlHinh nvarchar (500)

as

 begin

 begin tran

insert into 

Voucher (TenVoucher ,ThongTinChiTiet,

 NgayBatDau, NgayKetThuc,GiaGoc,Gia

KhuyenMai,SoLuong,TrangThai,MaLoai

HinhDV,MaDoanhNghiep,UrlHinh)

values(@TenVoucher ,@ThongTinChiTi

et,@NgayBatDau,@NgayKetThuc,@Gia

Goc,@GiaKhuyenMai,@SoLuong,1,@M

aLoaiHinhDV,@MaDoanhNghiep,@Url

Hinh) 

select * from Voucher where 

GiaKhuyenMai between @MucGia1

and @MucGia2 and TrangThai = 1

if (@@ERROR  <>0)

 begin

 print  N'Giao tác bị lỗi'

rollback  tran

return

end

commit tran

end

go 

if (@@ERROR  <>0)

 begin

 print  N'Giao tác bị lỗi'

rollback  tran

return

end 

commit tran

end

go 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 93 

7.  Trƣờ ng hợ p 7: 

a.  Giải quyết:

- Sử dụng mức cô lậpSerializable cho giao tác T1 để giải quyết

- Giải thích : 

o  Giả sử T1 tìm kiếm Voucher với tên có từ khóa là “abc” 

o  Ban đầu T1 thực hiện đếm số lượ ng Voucher với tên có từ khóa là “abc”

(giả sử gọi là đơn vị dữ liệu A) => T1 giữ Shared Lock trên A 

o  T1 đang ở mức cô lập Serializable thì sẽ giữ Shared Lock cho đến hết

giao tác và ngăn cản việc insert dữ liệu thỏa điều kiện thiết lậ p Shared

Lock (ngăn cản việc insert Voucher với tên có từ khóa là “abc” vì T1

đang giữ Shared Lock trên A). Do vậy, T2 không thể thực hiện việc

insert Voucher với tên có từ khóa là “abc”cho đến khi T1 k ết thúc

(Commit)

=>đảm bảo tính đồng nhất dữ liệu

 b.  Xử lý tại Stored Procedure:

T1

Tìm kiếmT2

Thêm Voucher create  proc sp_TimKiemTheoTen_fix

@Ten nvarchar (200),

@soluong int output

as

 begin

 begin tran

set transaction isolation level 

serializable

set @soluong = (select 

COUNT(*) from Voucher where 

TenVoucher like  N'%'+@Ten+'%' and 

TrangThai = 1)

waitfor  delay '00:00:10' 

create  proc sp_ThemVoucher 

@TenVoucher nvarchar (200),

@ThongTinChiTiet nvarchar (200),

@NgayBatDau datetime,

@NgayKetThuc datetime,

@GiaGoc decimal,

@GiaKhuyenMai decimal,

@SoLuong int,

@MaLoaiHinhDV int,

@MaDoanhNghiep int,

 

 

Hệ Quản Trị Cơ SởDữ Liệu 94 

@UrlHinh nvarchar (500)

as

 begin

 begin tran

insert into 

Voucher (TenVoucher ,ThongTinChiTiet, N

gayBatDau, NgayKetThuc,GiaGoc,GiaKh

uyenMai,SoLuong,TrangThai,MaLoaiHin

hDV,MaDoanhNghiep,UrlHinh)

values(@TenVoucher ,@ThongTinChiTiet

,@NgayBatDau,@NgayKetThuc,@GiaGo

c,@GiaKhuyenMai,@SoLuong,1,@MaLo

aiHinhDV,@MaDoanhNghiep,@UrlHinh

)

select * from Voucher where 

TenVoucher like  N'%'+@Ten+'%' and 

TrangThai = 1

if (@@ERROR  <>0)

 begin

 print  N'Giao tác bị lỗi'

rollback  tran

return

end 

commit tran

end

go 

if (@@ERROR  <>0)

 begin

 print  N'Giao tác bị lỗi'

rollback  tran

return

end 

commit tran

end

go

8.  Trƣờ ng hợ p 8: 

a.  Giải quyết:

- Sử dụng mức cô lậpSerializable cho giao tác T1 để giải quyết

- Giải thích : 

o  Ban đầu T1 thực hiện đếm số lượ ng hợp đồng còn thờ i hạn

(TrangThai=1), (giả sử gọi là đơn vị dữ liệu A) => T1 giữ Shared Lock 

trên A 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 95 

o  T1 đang ở mức cô lập Serializable thì sẽ giữ Shared Lock cho đến hết

giao tác và ngăn cản việc insert dữ liệu thỏa điều kiện thiết lậ p Shared

Lock (ngăn cản việc insert thêm hợp đồng có TrangThai=1 vì T1 đang

giữ Shared Lock trên A). Do vậy, T2 không thể thực hiện việc insert

thêm hợp đồng có TrangThai=1 cho đến khi T1 k ết thúc (Commit) 

=>đảm bảo tính đồng nhất dữ liệu

 b.  Xử lý tại Stored Procedure:

T1

Lấy danh sách hợp đồng còn thờ ihạn

T2Thêm hợp đồng

create  proc 

sp_XemDanhSachHopDongConThoiHan

 _fix

@maDN int,

@soluong int output

as

 begin

 begin tran

set transaction isolation level 

serializable

set @soluong = (select 

COUNT(*) from HopDong where 

TrangThai = 1 and MaDoanhNghiep = 

@maDN)

waitfor  delay '00:00:15' 

create  proc sp_ThemHopDong

@NgayKy datetime,

@ThoiHan datetime,

@MoTa ntext,

@MaDoanhNghiep int

as

 begin

 begin tran

insert into 

HopDong( NgayKy,ThoiHan,MoTa,TrangT

hai,MaDoanhNghiep) 

values(@NgayKy,@ThoiHan,@MoTa,1,@

MaDoanhNghiep) 

select * from HopDong where TrangThai

= 1 and MaDoanhNghiep = @maDN

if (@@ERROR  <>0 )

 begin

 

 

Hệ Quản Trị Cơ SởDữ Liệu 96 

 print  N'Giao tác bị lỗi'

rollback  tran

return

end

commit tran

end

go 

if (@@ERROR  <>0 )

 begin

 print  N'Giao tác bị lỗi'

rollback  tran

return

end

commit tran

end

go

9.  Trƣờ ng hợ p 9: 

a.  Giải quyết:

- Sử dụng mức cô lậpSerializable cho giao tác T1 để giải quyết

- Giải thích : 

o  Ban đầu T1 thực hiện đếm số lượ ng hợp đồng hết thờ i hạn

(TrangThai=0), (giả sử gọi là đơn vị dữ liệu A) => T1 giữ Shared Lock 

trên A 

o  T1 đang ở mức cô lậ p Serializable thì sẽ giữ Shared Lock cho đến hết

giao tác và ngăn cản việc insert dữ liệu thỏa điều kiện thiết lậ p Shared

Lock (ngăn cản việc insert thêm hoặc update hợp đồng có TrangThai=0

vì T1 đang giữ Shared Lock trên A). Do vậy, T2 không thể thực hiện

việc insert thêm hoặc update hợp đồng có TrangThai=0 cho đến khi T1

k ết thúc (Commit) 

=>đảm bảo tính đồng nhất dữ liệu

 

 

Hệ Quản Trị Cơ SởDữ Liệu 97 

 b.  Xử lý tại Stored Procedure:

T1

Lấy danh sách hợp đồng hết thờ ihạn

T2

Cập nhật lại trạng thái hợ pđồng (hết hạn) 

create  proc 

sp_XemDanhSachHopDongHetThoiHan_fix

@maDN int,

@soluong int output

as

 begin

 begin tran

set transaction isolation level 

serializable

set @soluong = (select 

COUNT(*) from HopDong where TrangThai

= 0 and MaDoanhNghiep = @maDN)

waitfor  delay '00:00:05' 

create  proc sp_CapNhatHopDong

@MaHopDong int

as

 begin tran

Declare @TrangThaiCu int

select @TrangThaiCu= 

TrangThai from HopDong where 

MaHopDong = @MaHopDong

declare @TrangThaiMoi int

if (@TrangThaiCu = 0)

set @TrangThaiMoi = 1

else

set @TrangThaiMoi = 0

update HopDong set TrangThai

= @TrangThaiMoi where MaHopDong

= @MaHopDong 

select * from HopDong where TrangThai = 0

and MaDoanhNghiep = @maDN

if (@@ERROR  <>0 )

 begin

 print  N'Giao tác bị lỗi'

rollback  tran

return

end

commit tran

end

go

if (@@ERROR  <>0 )

 

 

Hệ Quản Trị Cơ SởDữ Liệu 98 

 begin

 print  N'Giao tác bị lỗi'

rollback  tran

return

end

commit tran 

go

10. Trƣờ ng hợ p 10: 

a.  Giải quyết:

- Sử dụng mức cô lập Repeatable Read cho giao tác T1 để giải quyết

- Giải thích : 

o  Ban đầu T1 thực hiện đếm số lượng Voucher có giá từ MucGia1 đến

MucGia2 (giả sử gọi là đơn vị dữ liệu A) => T1 giữ Shared Lock trên A 

o  T1 đang ở mức cô lập Repeatable Readthì sẽ giữ Shared Lock cho đến

hết giao tác

o  Do vậy, T2 muốn cậ p nhật lại thông tin Voucher trên đơn vị dữ liệu A

thì phải xin cấp Exclusive Lock trên A, nhưng lúc này T1 đang giữ 

Shared Lock nên T2 không thể xin được Exclusive Lock cho đến khi T1

hoàn tất (Commit)

=>đảm bảo tính đồng nhất dữ liệu.

 b.  Xử lý tại Stored Procedure:

T1

Tìm kiếm

T2

Cập nhật Voucher

create  proc 

sp_TimKiemTheoGia_unrepeatable_fix

@MucGia1 decimal,

@MucGia2 decimal,

@soluong int output

as

 begin

 begin tran

set transaction isolation level repeatable 

read

set @soluong = (select COUNT(*) from 

Voucher where GiaKhuyenMai between 

@MucGia1 and @MucGia2 and TrangThai = 0)

waitfor  delay '00:00:05' 

create  proc sp_SuaVoucher 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 99 

@MaVoucher int,

@TenVoucher nvarchar (200),

@ThongTinChiTiet nvarchar (200),

@NgayBatDau datetime,

@NgayKetThuc datetime,

@GiaGoc decimal,

@GiaKhuyenMai decimal,

@SoLuong int,

@TrangThai int,

@UrlHinh nvarchar (100)

as

 begin tran

update Voucher 

set TenVoucher = @TenVoucher 

,ThongTinChiTiet = 

@ThongTinChiTiet, NgayBatDau = 

@NgayBatDau, NgayKetThuc = 

@NgayKetThuc,

GiaGoc = 

@GiaGoc,GiaKhuyenMai = 

@GiaKhuyenMai,SoLuong = 

@SoLuong,TrangThai = @TrangThai,UrlHinh

= @UrlHinh

where MaVoucher = @MaVoucher 

waitfor  delay '00:00:15'

if (@GiaKhuyenMai > @GiaGoc)

 begin 

raiserror ('Loi',1,0)

rollback  tran

return

end 

select * from Voucher where GiaKhuyenMai

 between @MucGia1 and @MucGia2 and 

TrangThai = 0

if (@@ERROR  <>0)

 begin

 print  N'Giao tác bị lỗi'

rollback  tran

return

end 

commit tran

end

go 

if (@@ERROR  <> 0)

 begin

 print  N'Giao tac bi loi'

rollback  tran

return

end

commit tran

go 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 100 

11. Trƣờ ng hợ p 11: 

c.  Giải quyết:

- Sử dụng mức cô lâp Repeatable Read và Lock hints (updlock) để giải quyết

- Giải thích :

o  Cả 2 giao tác ban đầu sẽ đọc cùng 1 đơn vị dữ liệu cùng 1 thời điểm

(đọc tr ạng thái thẻ nạp trên trên cùng 1 mã Thẻ nạ p ) = > cả 2 giao tác

cùng thực hiện trên 1 đơn vị dữ liệu (giả sử gọi là A) nên T1,T2 cùng

giữ  Shared Lock trên A 

o  Sử dụng cô lập Repeatable Read để cho phép T1 và T2 có thể ghi trên

dữ liệu thỏa điều kiện đang có Shared Lock (trên A) 

o  Sau đó T1 muốn thực hiện ghi trên A cần phải xin Exclusive Lock 

nhưng lúc này T2 đang giữ  Shared Lock và cũng muốn thực hiện ghi

A nên không thể nhả Shared Lock để hệ quản tr ị cấ p Exclusive Lock 

cho T1 được = > 2 giao tác rơi vào tình trạng chờ  đợ i lẫn nhau ( chờ   bên

kia nhả khóa) => xảy ra deadlock.

o  Sử dụng Updlock để nâng cấ p từ Shared Lock lên Exclusive Lock, tại 1

thời điểm chỉ có 1 Updlock được phát trên 1 đơn vị dữ liệu nên sẽ đảm

 bảo đượ c việc giao tác này có thể nâng cấp Shared Lock lên Exclusive

Lock mà không cần phải chờ  giao tác k ia nhả khóa. 

=> đảm bảo tính hợ  p lệ cho trườ ng hợp 2 khách hàng cùng nạ p chung 1

thẻ nạ p tại cùng 1 thời điểm

d.  Xử lý tại Stored Procedure:

T1 T2

create  proc sp_NapThe_fix

@MaKH int,

@Series varchar (50),

@Code varchar (50),

@flag int output

AS

BEGIN

EXEC sp_KiemTraTheNap  

@Series,@Code,@flag output---kiem tra the

IF(@flag<>0)---neu the hop le

Begin

 

 

Hệ Quản Trị Cơ SởDữ Liệu 101 

 begin tran

set transaction isolation level 

repeatable read

--lay trang thai the nap

declare @TrangThai int

select @TrangThai = 

TrangThai from TheNap with (updlock ) 

where Series = @Series and Code = @Code

waitfor  delay '00:00:05'

create  proc sp_NapThe_fix

@MaKH int,

@Series varchar (50),

@Code varchar (50),

@flag int output

AS

BEGIN

EXEC sp_KiemTraTheNap  

@Series,@Code,@flag output---kiem tra the

IF(@flag<>0)---neu the hop le

Begin

 begin tran

set transaction isolation level 

repeatable read

--lay trang thai the

nap

declare @TrangThai

int

select @TrangThai = 

TrangThai from TheNap with (updlock ) 

where Series = @Series and Code = @Code

waitfor  delay '00:00:05'

if (@TrangThai = 1)

 begin

declare @matk 

int ---lay ra ma tai khoan tu ma khach hang

EXEC 

sp_LayIDTaiKhoanTheNap  @MaKH,@matk 

output

---cap nhat bang

the nap ve ngay nap va ma khach hang da nap

the , va ngung hoat dong the

declare 

@menhgia decimal(18,0)

declare @tilekm

int

----Lay ra menh

gia va ti le khuyen mai cua the vua nap

Select 

@menhgia=MenhGia,@tilekm=TiLeKhuyen

Mai from TheNap where MaTheNap=@flag

 

 

Hệ Quản Trị Cơ SởDữ Liệu 102 

set @menhgia = 

@menhgia+(@menhgia * @tilekm)/100 --

tinh lai menh gia the nap co khuyen mai

----Thuc hien

cong tien cho tai khoan

EXEC 

sp_ThemTientaiKhoanTheNap  

@MaKH,@menhgia

Update TheNap

set 

MaTaiKhoan=@matk , NgayNap=GETDATE(

), TrangThai=0 where MaTheNap=@flag

end

if (@TrangThai = 1)

 begin

declare 

@matk int ---lay ra ma tai khoan tu ma

khach hang

EXEC 

sp_LayIDTaiKhoanTheNap  

@MaKH,@matk output

---cap nhat

 bang the nap ve ngay nap va ma khach hang

da nap the , va ngung hoat dong the

declare 

@menhgia decimal(18,0)

declare 

@tilekm int

----Lay ra

menh gia va ti le khuyen mai cua the vua

nap

Select 

@menhgia=MenhGia,@tilekm=TiLeKhuye

nMai from TheNap where 

MaTheNap=@flag

set @menhgia

= @menhgia+(@menhgia * @tilekm)/100 --

tinh lai menh gia the nap co khuyen mai

----Thuc hien

cong tien cho tai khoan

EXEC 

sp_ThemTientaiKhoanTheNap  

@MaKH,@menhgia

Update 

TheNap set 

MaTaiKhoan=@matk , NgayNap=GETDAT

E(),

TrangThai=0 where MaTheNap=@flag

end

 

 

Hệ Quản Trị Cơ SởDữ Liệu 103 

Trang Chủ 

DS Deal

Theo loại 

TheoDoanhNghiệp 

Hôm nay 

 

Gần đây 

Chi tiếtvoucher 

Muavoucher 

Giỏ hàng 

Thanh toán 

Thanh toán thành công 

Tìm kiếm  Liên Hệ   Đăng nhập 

Thông tincá nhân 

Logout   Đổi MK  Nạp thẻ 

Xem TTnạp thẻ 

Xem LSmua hàng 

Chi tiết LSmua hàng 

 Đăng ký 

 Đăng ký thành công 

MuaVoucher 

if (@@ERROR  <>0)

 begin

 print  N'Giao tác bị lỗi'

rollback  tran

return

end

commit tran

END

END

if (@@ERROR  <>0)

 begin

 print  N'Giao tác bị lỗi'

rollback  tran

return

end 

commit tran

END

END 

5  Ứ NG DỤNG DEMO

5.1    Mô tả c ấu trúc ứ ng d ụng 

- [Mô tả sitemap của website]

a.  Khách Hàng 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 104 

b.  Admin

c.  Doanh Nghiệp

- [Thông tin của link download project, phim…]  

Project : http://www.mediafire.com/download/rc51otc7j9ob7dm/15_PROJECTDEMO.rar  

Video demo : http://www.mediafire.com/download/l40djs5504nv0p2/15_VIDEODEMO.rar  

 

Admin 

QL Voucher 

Xem VCĐang HĐ 

Xem VCNgưng HĐ 

Giảm giá KM 

Xóa/SửaVoucher 

QL Thẻ Nạp 

Xem thẻchưa dùng 

Xem thẻdùng rồi 

Thêm thẻmới 

Cập nhật tỉlệ KM 

QL ĐơnHàng 

Đã thanhtoán 

Chưa thanhtoán 

Thanh toánĐH trả sau 

QL DoanhNghiệp 

QL hợpđồng 

Cài đặt 

Thay đổimật khẩu 

Logout 

DoanhNghiệp 

Đổi MậtKhẩu 

Quản LýVoucher 

DS Voucherđang HĐ 

DS Voucherngưng HĐ 

DS Voucher _All 

ThêmVoucher 

Cập nhật giáKM 

Xem Thông TinHợp Đồng 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 105 

5.2   Tình huố ng tranh ch ấp đồng th ờ i 

[Với m ỗi tình huống tranh ch ấ p chụp hình giao diện của các chức năng gây tranh chấ p

(có dữ liệu test)]

a.  Tình huống gây lỗi 1:

  Giao tác 1:Admin(admin-admin1702)

  Giao tác 2:Doanh nghiệ p (tokyodeli-tokyodeli123)

 

 

Hệ Quản Trị Cơ SởDữ Liệu 106 

b.  Tình huống gây lỗi 2:

  Giao tác 1:Khách hàng 1 (huynhtuytram – huynhtuytram760)

Bước 1: Đặt hàng 

Bước 2: Thanh toán 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 107 

  Giao tác 2:Khách hàng 2 (khuctuandinh-khuctuandinh500)

Bước 1: Đặt hàng 

Bước 2: Thanh toán 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 108 

c.  Tình huống gây lỗi 3:

  Giao tác 1:Khách hàng 1 (huynhtuytram – huynhtuytram760)

  Giao tác 2:Admin(admin-admin1702)

 

 

Hệ Quản Trị Cơ SởDữ Liệu 109 

d.  Tình huống gây lỗi 4:

  Giao tác 1:Khách hàng 1 (huynhtuytram – huynhtuytram760).

Bước 1: Đặt hàng

Bước 2: Thanh toán 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 110 

  Giao tác 2:Admin(admin-admin1702)

Bướ c 1 : Quản lý voucher  

Bướ c 2: Sửa voucher 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 111 

e.  T ình huống gây lỗi 5:

  Giao tác 1:Khách hàng 1 (huynhtuytram – huynhtuytram760).

  Giao tác 2:Khách hàng 2 (khuctuandinh-khuctuandinh500)

 

 

Hệ Quản Trị Cơ SởDữ Liệu 112 

f.  Tình huống gây lỗi 6:

  Giao tác 1:Khách hàng (vãng lai ) 

  Giao tác 2:Doanh nghiệ p (tokyodeli-tokyodeli123)

 

 

Hệ Quản Trị Cơ SởDữ Liệu 113 

g.  Tình huống gây lỗi 7:

  Giao tác 1:Khách hàng (vãng lai ) 

  Giao tác 2:Doanh nghiệ p (tokyodeli-tokyodeli123)

 

 

Hệ Quản Trị Cơ SởDữ Liệu 114 

h.  Tình huống gây lỗi 8:

  Giao tác 1:Doanh nghiệ p (tokyodeli-tokyodeli123)

  Giao tác 2:Admin(admin-admin1702)

 

 

Hệ Quản Trị Cơ SởDữ Liệu 115 

i.  Tình huống gây lỗi 9:

  Giao tác 1:Doanh nghiệ p (tokyodeli-tokyodeli123)

  Giao tác 2:Admin(admin-admin1702) (Doanh nghiệ p >>Quản lý hợ  p

đồng )

 

 

Hệ Quản Trị Cơ SởDữ Liệu 116 

 j.  Tình huống gây lỗi 10:

  Giao tác 1:Khách hàng (vãng lai ) 

  Giao tác 2:Admin(admin-admin1702) (Voucher đang hoạtđộng >> Sửa

voucher )

 

 

Hệ Quản Trị Cơ SởDữ Liệu 117 

k.  Tình huống gây lỗi 11:

  Giao tác 1:Khách hàng 1 (huynhtuytram – huynhtuytram760)

  Giao tác 2:Khách hàng 2 (khuctuandinh-khuctuandinh500)

 

 

Hệ Quản Trị Cơ SởDữ Liệu 118 

5.3  Bộ dữ liệu test các tình huống

[Mô tả bộ dữ liệu test tình huống tranh ch ấp trên ứng dụng]

1.  Trƣờ ng hợ p 1: 

a.  Bộ dữ liệu test:

- Tài khoản: admin và tokyodeli 

- Mã sản phẩm cậ p nhật : 18

- Giá khuyến mãi cậ p nhật:

  admin: +10K 

  tokyodeli: -20K 

 b.  Tình huống gây lỗi:

- Chức năng: Admin và doanh nghiệp cùng cậ p nhật lại giá khuyến mãi của

Voucher có MaVoucher = 18 tại 1 thời điểm.

- Dữ liệu:

  Admin: đăng nhập vào tài khoản admin vào quản lí Voucher ->

Sửa giá khuyến mãi. Tìm Voucher có MaVoucher = 18 với Giá

khuyến mãi = 460000. Chọn mức cậ p nhật: +10K.

  Doanh nghiệp: đăng nhậ p bằng tài khoản tokyodeli vào Quản lý

Voucher -> Cậ p nhật giá khuyến mãi Voucher. Tìm Voucher có

MaVoucher = 18 với Giá khuyến mãi = 460000. Chọn mức cậ p

nhật: -20K.

- K ết quả: Sau khi admin và doanh nghiệp cùng cậ p nhật giá trên

MaVoucher = 18 thì Giá khuyến mãi hiện tại của admin và tokyodeli là

470000 (nhưng Giá khuyến mãi đúng đắn sau khi cậ p nhật phải là

450000).

2.  Trƣờ ng hợ p 2: 

a.  Bộ dữ liệu test:

- Tài khoản: huynhtuytram và khuctuandinh 

- Tên Voucher: Buffet trưa tại Nhà hàng BBQ House 

- Số lượ ng –  địa chỉ giao hàng –  hình thức thanh toán: 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 119 

  huynhtuytram: 10 -16 Tôn Thất Tùng Quận 1 –  Thanh toán sau khi

nhận hàng 

  khuctuandinh: 5 –  16 Tôn Đản Quận 4 –  Thanh toán sau khi nhận

hàng 

 b.  Tình huống gây lỗi:

- Chức năng: 2 khách hàng huytuytram và khuctuandinh thanh toán

Voucher có tên Buffet trưa tại Nhà hàng BBQ House vớ i số lượng đã

chọn và cậ p nhật lại số lượ ng sản phẩm còn lại của Voucher đó tại cùng

một thời điểm.

- Dữ liệu:

  Khách hàng 1: tài khoản huynhtuytram mua Voucher tên Buffet

trưa tại Nhà hàng BBQ House vớ i số lượng là 10 và thanh toán sau

khi nhận hàng 

  Khách hàng 2: tài khoản khuctuandinh mua Voucher tên Buffet

trưa tại Nhà hàng BBQ House vớ i số lượng là 5 và thanh toán sau

khi nhận hàng 

- K ết quả:

  Số lượng còn lại của Voucher (Buffet trưa tại Nhà hàng BBQ

House) trước khi 2 khách hàng mua là 90. 

  Sau khi huynhtuytram và khuctuandinh thanh toán thì số lượng còn

lại của Voucher đó là 85 (nhưng số lượng còn lại đúng đắn phải là

75).

3.  Trƣờ ng hợ p 3: 

a.  Bộ dữ liệu test:

- Tài khoản: admin, huytuytram

- Thẻ nạ p: Series: VC00001 – Code: 201330030

- Cậ p nhật tỉ lệ khuyến mãi: Tỉ lệ: 500% - Mệnh giá: 10000 

 b.  Tình huống gây lỗi:

 

 

Hệ Quản Trị Cơ SởDữ Liệu 120 

- Chức năng: admin cậ p nhật tỉ lệ khuyến mãi không hợ  p lệ và bị hủy giao

tác trong khi đó khách hàng (huynhtuytram) nạ p thẻ có mệnh giá trùng

vớ i mệnh giá admin đang cậ p nhật.

- Dữ liệu:

  Admin: đăng nhậ p bằng tài k hoản admin vào quản lí Thẻ Nạ p ->

Cậ p nhật tỉ lệ khuyến mãi. Chọn mệnh giá cậ p nhật là 10000 vớ i tỉ 

lệ khuyến mãi 500%.

  Khách hàng: đăng nhậ p bằng tài khoản huynhtuytram xem thông

yin cá nhân và chọn chức năng nạ p thẻ vớ i số Series: VC00001 và

Code: 201330030. Mệnh giá thẻ nạp mà huynhtuytram nạp là

10000 trùng vớ i mệnh giá mà admin đang cậ p nhật lại tỉ lệ khuyến

mãi 

- K ết quả:

  Vì tỉ lệ khuyến mãi > 100 so với quynh định nên tất cả thẻ nạp có

mệnh giá 10000 khi admin cậ p nhật có tỉ lệ khuyến mãi là 0 

  Số dư tài khoản của huynhtuytram sau khi nạ p thẻ là 60000 (giá trị 

đúng đằn của số dư tài khoản của huynhtuytram phải là 10000). 

4.  Trƣờ ng hợ p 4: 

a.  Bộ test dữ liệu:

- Tài khoản: admin – huynhtuytram

- Voucher tương tác: Mã: 18 –  Tên: Set ăn bê thui(2-3 ngườ i) –  Quán bê

thui Bốn Mùa 

- Số lượ ng mua: 1

- Thông tin Voucher: Giữa nguyên chỉ thay đổi giá KM từ 470000 =>

800000 (cao hơn giá gốc)

 b.  Tình huống gây lỗi:

- Chức năng: admin thực hiện cậ p nhật lại giá khuyến mãi của một

Voucher nhưng không hợ  p lệ và bị hủy giao tác –  khách hàng mua

Vouhcer thanh toán và đọc dữ liệu rác do admin cậ p nhật và lưu vào đơn

hàng. 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 121 

- Dữ liệu:

  Admin: đăng nhập vào tài khoản admin vào quản lí Voucher ->

Voucher đang hoạt động chọn doanh nghiệ p tokyodeli, chọn chức

năng sửa của Voucher tên Set ăn bê thui (2-3 ngườ i) –  Quán bê

thui Bốn Mùa. Giữ nguyên các giá trị chỉ thay đổi giá khuyến mãi

từ 470000 => 800000.

  Khách hàng: đăng nhậ p bằng tài khoản huynhtuytram và tìm mua

Voucher Set ăn bê thui (2-3 ngườ i) –  Quán bê thui Bốn Mùa vớ i số 

lượng là 1. 

- K ết quả:

  Vì tỉ lệ KM khi cậ p nhật lớn hơn giá gốc (600000) của Voucher 

nên sau khi cậ p nhật giá KM vẫn là 470000. 

  Trong khi đó, khách hàng huynhtuytram sau khi thanh toán vào

xem lịch sử mua hàng của Voucher Set ăn bê thui (2-3 ngườ i) –  

Quán bê thui Bốn Mùa có giá khuyến mãi là 800000. ( Giá khuyến

mãi đúng đắn phải là 470000). 

5.  Trƣờ ng hợ p 5: 

a.  Bộ dữ liệu test:

- Tài khoản: kieutrieukien – khuctuandinh

- Thẻ nạ p: Series: VC00002 – Code: 201330031

 b.  Tình huống gây lỗi:

- Chức năng: 2 khách hàng cùng nạ p 1 thẻ tại 1 thời điểm

- Dữ liệu:

  Khách hàng 1: đăng nhậ p bằng tài khoản khuctuandinh vào trang

thông tin cá nhân chọn chức năng Nạ p thẻ vớ i Series: VC00002 – 

Code: 201330031.

  Khách hàng 2: đăng nhậ p bằng tài khoản kieutrieukien vào trang

thông tin cá nhân chọn chức năng Nạ p thẻ vớ i Series: VC00002 – 

Code: 201330031.

 

 

Hệ Quản Trị Cơ SởDữ Liệu 122 

- K ết quả: cả 2 khách hàng đều nạ p thẻ đượ c vớ i số dư tài khoản là 20000

nhưng thông tin lịch sử nạ p thẻ khách hàng đầu khuctuandinh bị mất (k ết

quả đúng đắn chỉ có 1 khách hàng nạ p thẻ thành công, khách hàng có

giao tác thực hiện trướ c).

6.  Trƣờ ng hợ p 6: 

a.  Bộ dữ liệu test:

- Tài khoản: tokyodeli –  khách vãng lai 

- Tìm kiếm: mức giá < 100K  

- Thêm sản phẩm: Tên: Bạch tuộc nướ ng –  Mô tả: Yummy –   Ngày bắt đầu:

15/05/2013 –   Ngày kết thúc: 30/06/2013 –  Giá gốc: 70000 –  Giá KM:

40000 – Số lượ ng: 70 – Loại hình: Nhà hàng –  quán ăn –  Url hình: (tùy

chọn).

 b.  Tình huống gây lỗi:

- Chức năng: khách hàng tìm kiếm các sản phẩm có mức giá nằm trong

khoảng giá bất k ỳ mà khách hàng chọn, cùng lúc đó doanh nghiệp thêm 1

Voucher có mức giá nằm trong khoảng giá mà khách hàng tìm kiếm.

- Dữ liệu:

  Khách hàng: có tài khoản hoặc chưa có tài khoản chọn chức năng

tìm kiếm vớ i mức giá tìm kiếm < 100K 

  Doanh nghiệp: đăng nhậ p bằng tài khoản tokyodeli vào Quản lí

Voucher -> Thêm Voucher với các thông tin: Tên: Bạch tuộc

nướ ng –  Mô tả: Yummy –   Ngày bắt đầu: 15/05/2013 –   Ngày kết

thúc: 30/06/2013 –  Giá gốc: 70000 –  Giá KM: 40000 – Số lượ ng:

70 – Loại hình: Nhà hàng –  quán ăn –  Url hình: (tùy chọn).

- K ết quả: khách hàng sau khi tìm kiếm mức giá Voucher < 100K kết quà

tìm được có số lượng: 12 Voucher nhưng danh mục các Voucher đượ c

show ra lại có đến 13 Voucher (k ết quả tìm kiếm đúng đắn phải là số 

lượng voucher tìm kiếm là 12 và danh mục voucher là 12). 

7.  Trƣờ ng hợ p 7: 

a.  Bộ dữ liệu test:

- Tài khoản: tokyodeli –  khách vãng lai 

 

 

Hệ Quản Trị Cơ SởDữ Liệu 123 

- Tìm kiếm: spa

- Thêm sản phẩm: Tên: Hoa Viên Spa –  Mô tả: beauty –   Ngày bắt đầu:

15/05/2013 –   Ngày kết thúc: 30/06/2013 –  Giá gốc: 70000 –  Giá KM:

30000 – Số lượ ng: 70 – Loại hình: Spa-Làm đẹ p –  Url hình: (tùy chọn)

 b.  Tình huống gây lỗi:

- Chức năng: khách hàng tìm kiếm các voucher theo tên, cùng lúc đó doanh

nghiệp thêm 1 Voucher có tên chứa chuỗi tìm kiếm của khách hàng. 

- Dữ liệu:

  Khách hàng: có tài khoản hoặc chưa có tài khoản chọn chức năng

tìm kiếm với tên tìm kiếm spa

  Doanh nghiệp: đăng nhậ p bằng tài khoản tokyodeli vào Quản lí

Voucher -> Thêm Voucher với các thông tin: Tên: Hoa Viên Spa –  

Mô tả: beauty –   Ngày bắt đầu: 15/05/2013 –   Ngày kết thúc:

30/06/2013 –  Giá gốc: 70000 –  Giá KM: 30000 – Số lượ ng: 70 –  

Loại hình: Spa-Làm đẹ p –  Url hình: (tùy chọn).

- K ết quả: khách hàng sau khi tìm kiếm các voucher có tên spa k ết quà tìm

được có số lượ ng: 6 voucher nhưng danh mục các Voucher đượ c show ra

lại có đến 7 voucher (k ết quả tìm kiếm đúng đắn phải là số lượ ng voucher 

tìm kiếm là 6 và danh mục voucher là 6).

8.  Trƣờ ng hợ p 8: 

a. Bộ dữ liệu test:

- Tài khoản: tokyodeli – admin

- Thêm hợp đồng: Doanh nghiệ p: Tokyodeli –   Ngày ký: 17/05/2013 –  

 Ngày hết hạn: 30/06/2013 –  Mô tả: Phải tuân theo mọi quy định của

MuaVoucher.

 b.  Tình huống gây lỗi:

- Chức năng: doanh nghiệp xem danh sách các hợp đồng còn hạn đã ký kết

vớ i MuaVoucher , cùng lúc đó admin thêm mớ i 1 hợp đồng ký kết vớ i

doanh nghiệp trên. 

- Dữ liệu:

 

 

Hệ Quản Trị Cơ SởDữ Liệu 124 

  Doanh nghiệp: đăng nhậ p bằng tài khoản tolyodeli vào quản lí Hợ  p

đồng -> Xem thông tin hợp đồng chọn xem Hợp đồng còn hạn.

  Admin: đăng nhậ p bằng tải khoản admin vào quản lí Doanh nghiệ p

-> Thêm hợp đồng với các thông tin: Tên doanh nghiệ p: Tokyodeli

 –   Ngày ký: 17/05/2013 –   Ngày hết hạn: 30/06/2013 –  Mô tả: Phải

tuân theo mọi quy định của MuaVoucher.

-  K ết quả: số lượ ng hợp đồng còn hạn của doanh nghiệp tokyodeli là 2

nhưng danh sách hợp đồng show ra có 3 hợp đồng (k ết quả tr ả về đúng đắn

 phải là 2 hợp đồng còn hạn và danh sách hợp đồng là 2). 

9.  Trƣờ ng hợ p 9: 

a.  Bộ dữ liệu test:

- Tài khoản: tokyodeli - admin

- Hủy hợp đồng: Doanh nghiệ p: Tokyo Deli - Mã hợ  p đồng: 46

 b.  Tình huống gây lỗi:

- Chức năng: doanh nghiệp xem danh sách các hợp đồng hết hạn đã ký kết

với MuaVoucher, cùng lúc đó admin thêm mớ i 1 hợp đồng ký kết vớ i

doanh nghiệp trên. 

- Dữ liệu:

  Doanh nghiệp: đăng nhậ p bằng tài khoản tolyodeli vào quản lí Hợ  p

đồng -> Xem thông tin hợp đồng chọn xem Hợp đồng hết hạn.

  Admin: đăng nhậ p bằng tải khoản admin vào quản lí Doanh nghiệ p

-> Quản lí hợp đồng tìm hợp đồng có mã hợp đồng là 46 của doanh

nghiệ p tokyodeli chọn chức năng kích hoạt hợp đồng từ hết thờ i

hạn chuyển sang còn thờ i hạn

-  K ết quả: số lượ ng hợp đồng hết hạn của doanh nghiệp tokyodeli là 1 nhưng

danh sách khi show ra lại không có hợp đồng nào (k ết quả tr ả về đúng đắn

 phải là 1 hợp đồng hết hạn và danh sách hợp đồng là 1).

10.  Trƣờ ng hợ p 10: 

a.  Bộ dữ liệu test:

- Tài khoản: Khách vãng lai - Admin

 

 

Hệ Quản Trị Cơ SởDữ Liệu 125 

- Tìm kiếm: mức giá < 100k  

- Sửa Voucher: Tên: Bạch tuộc nướ ng - Mô tả: Yummy - Ngày bắt đầu:

15/05/2013 - Ngày kết thúc: 30/06/2013 - Giá gốc: 700000 - Giá KM:

400000 - Số lượ ng: 70 - Url hình:(tùy chọn)

 b.  Tình huống gây lỗi:

- Chức năng: khách hàng tìm kiếm các sản phẩm có mức giá nằm trong

khoảng giá bất k ỳ mà khách hàng chọn, cùng lúc đó doanh nghiệ p chỉnh

sửa giá của 1 Voucher có mức giá nằm trong khoảng giá mà khách hàng

tìm kiếm.

- Dữ liệu:

  Khách hàng: có tài khoản hoặc chưa có tài khoản chọn chức năng

tìm kiếm vớ i mức giá tìm kiếm < 100K 

  Doanh nghiệp: đăng nhậ p bằng tài khoản tokyodeli vào Quản lí

Voucher -> Voucher đang hoạt động chọn doanh nghiệ p tokypdeli

và Sửa thông tin Voucher: Tên: Bạch tuộc nướ ng –  Mô tả: Yummy

 –   Ngày bắt đầu: 15/05/2013 –   Ngày kết thúc: 30/06/2013 –  Giá

gốc: 700000 –  Giá KM: 400000 – Số lượ ng: 70 –  Url hình: (tùy

chọn).

- K ết quả: khách hàng sau khi tìm kiếm mức giá Voucher < 100K kết quà

tìm được có số lượ ng: 14 voucher nhưng danh mục các voucher đượ c

show ra chỉ 13 Voucher (k ết quả tr ả về đúng đắn có số lượ ng 14 voucher 

và danh sách voucher là 14).

11.  Trƣờ ng hợ p 11: 

a.  Bộ dữ liệu test:

- Tài khoản: kieutrieukien - khuctuandinh

- Thẻ nạ p: Series: VC00004 - Code: 201330033

 b.  Tình huống gây lỗi:

- Chức năng: 2 khách hàng cùng nạ p 1 thẻ tại 1 thời điểm

- Dữ liệu:

 

 

Hệ Quản Trị Cơ SởDữ Liệu 126 

  Khách hàng 1: đăng nhậ p bằng tài khoản kieutrieukien vào trang

thông tin cá nhân chọn chức năng Nạ p thẻ vớ i Series: VC00004 – 

Code: 201330033.

  Khách hàng 2: đăng nhậ p bằng tài khoản khuctuandinh vào trang

thông tin cá nhân chọn chức năng Nạ p thẻ vớ i Series: VC00004 – 

Code: 201330033.

- K ết quả: cả 2 khách hàng đều nạ p thẻ thành công nhưng chỉ có khách

hàng kieutrieukien đượ c cộng tiền vào số dư tài khoản còn khách hàng

khuctuandinh thì không (kết quả đúng đắn chỉ 1 trong hai khách hàng nạ p

thành công, khách hàng có giao tác chạy trướ c).

6  TỔNG K ẾT

K ết quả đạt đượ c:

- Hoàn thành các yêu cầu của đồ án 

- Hiểu rõ hơn các trườ ng hợp gây lỗi khi truy xuất đồng thờ i

- Thực hiện fix lỗi thành công trên giao diện

- Giao diện người dùng đẹ p, dễ sử dụng