Do đó cần một trang web quản lý đơn giản, dễ sử dụng và có thể tiết kiệm thời gian cho việc quản lý, hạn chế những sai số và có thể đáp ứng được nhu cầu mà người sử dụng đang cần và tích
TỔNG QUAN VỀ ĐỀ TÀI
Đặt vấn đề
Ngày nay, khi cuộc sống của mỗi người dân đang từng bước được nâng cao thì nhu cầu về mua sắm, vui chơi giải trí ngày càng được chú trọng Do đó, các doanh nghiệp cũng quan tâm ưu tiên cho việc phát triển các khu thương mại mua sắm nhằm đáp ứng nhu cầu của người dân Và siêu thị là một nơi mua sắm mà có thể đáp ứng các nhu cầu tiêu dùng của mọi người Với sự phát triển ngày càng rộng, yêu cầu công nghệ hóa các quy trình nghiệp vụ trong siêu thị là điều tất yếu, nhằm mục đích làm đơn giản hóa các nghiệp vụ cũng như tăng khả năng phục vụ khách hàng trở nên nhanh chóng và hiệu quả
Chính vì nhu cầu mua sắm ngày càng tăng, nên sự đòi hỏi đáp ứng nhu cầu về mặt hàng hóa cũng như sản phẩm ngày càng cao Ngoài ra việc đảm bảo các vấn đề vệ sinh an toàn thực phẩm, nguồn gốc xuất xứ, thực phẩm xanh trên các trang web bán hàng vẫn còn nhiều hạn chế Do đó cần một trang web quản lý đơn giản, dễ sử dụng và có thể tiết kiệm thời gian cho việc quản lý, hạn chế những sai số và có thể đáp ứng được nhu cầu mà người sử dụng đang cần và tích hợp các tiêu chí về giá trị dinh dưỡng của sản phẩm trên trang web nhằm tạo sự yên tâm cho khách hàng khi sử dụng và mua sản phẩm.
Giải pháp
Thiết kế và xây dựng trang web bán hàng siêu thị kế thừa mô hình hoạt động của các siêu thị hiện có trên thực tế Đồng thời ứng dụng công nghệ với mục đích làm cho chương trình có thể đáp ứng được nhu cầu quản lý ngày càng phức tạp, dễ dàng trong triển khai Xây dựng website đơn giản, thân thiện với người dùng, tiết kiệm thời gian làm thủ tục tại cửa hàng, giảm sai sót, đáp ứng nhu cầu hiện tại của người dùng, tích hợp tiêu chí giá trị dinh dưỡng của sản phẩm trên website nhằm tạo sự yên tâm cho khách hàng khi sử dụng và mua hàng
Trang web đồng thời là công cụ quản lý bán hàng hiệu quả, làm đơn giản hóa việc lập các hóa đơn giấy tờ cũng như việc lưu trữ chúng, cung cấp thông tin nhanh chóng và chính xác làm cơ sở cho việc ra quyết định trong kinh doanh, phục vụ hữu hiệu cho việc quản lý và phát triển của siêu thị.
Phát biểu bài toán
Xây dựng một hệ thống ứng dụng hoàn thiện để các khách hàng có nhu cầu mua sắm online có thể thao tác một cách an toàn, thuận tiện và dễ quản lí các thông tin các thông tin cá nhân của mình Các nhân viên của cửa hàng cũng dễ dàng quản lí thông tin về sản phẩm, khách hàng, doanh thu và thông tin cá nhân của mình
Hằng ngày, hệ thống tiếp nhận các yêu cầu mua hàng của khách hàng Hệ thống sẽ tự động lập các hóa đơn tính tiền một cách nhanh chóng cho các đơn hàng của khách hàng Sau mỗi đơn hàng được giao thành công, hệ thống cần lưu lại thông tin và các đánh giá của khách hàng về sản phẩm để các nhân viên và bộ phận trong công ty sẽ xem qua các phản hồi của khách hàng và cải thiện từng ngày giúp cho cửa hàng ngày càng phát triển
Trang web sẽ luôn luôn hoạt động Vào cuối ngày, nhân viên dựa vào số lượng hiện có của mỗi sản phẩm sẽ thống kê tình hình bán hàng của siêu thị, tính toán số lượng hàng tồn, hàng hết để lên kế hoạch nhập hàng mới
Khi có hàng hết hoặc cần bổ sung hàng mới, siêu thị sẽ nhập hàng từ các nhà cung cấp Thông tin về hàng cần nhập phải được lưu lại để nhân viên kế toán thống kê tình hình mua bán trong siêu thị Thông tin này sẽ được trình lên ban giám đốc để duyệt xem có được phép nhập hàng hay không Khi nhập hàng mới, thì nhân viên kiểm kê sẽ tính toán số lượng rồi nhập vào hệ thống Hệ thống phải cho phép nhân viên nhập hàng mới vào hay cập nhật số lượng hàng
Các mục tiêu cụ thể:
• Quản lý nhân viên: Đảm bảo về nguồn nhân lực nhân viên có thể phục vụ nhu cầu mua sắm của khách hàng một cách hiệu quả làm hài lòng khách hàng
• Quản lý khách hàng: Quản lý thông tin khách hàng đồng thời theo dõi doanh số của khách hàng mua hàng tại cửa hàng
• Quản lý doanh thu: Theo dõi và quản lý doanh thu của cửa hàng để tối ưu hóa lợi nhuận và đảm bảo sự ổn định tài chính
• Quản lý mua bán hàng: Đảm bảo quy trình bán hàng được thực hiện nhanh chóng và hiệu quả, đa dạng hóa các mặt hàng và giảm thời gian chờ đợi cho khách hàng
• Đảm bảo việc tra cứu thông tin cho các đối tượng người dùng hệ thống
• Hỗ trợ tìm kiếm các thông tin một cách chính xác, nhanh chóng, hạn chế đến mức thấp nhất các rủi ro xảy ra với hệ thống
• Hệ thống hỗ trợ phân quyền người dùng, đảm bảo tính bảo mật, an toàn của hệ thống.
Quy trình nghiệp vụ và phân tích yêu cầu
Hình 1: Sơ đồ tổ chức siêu thị GreenMart
Nhân viên quản lí và các nhân viên khác còn lại phải đăng nhập vào trang web với tài khoản và mật khẩu đã được cửa hàng cung cấp trước
Khách hàng đăng kí tài khoản và dùng tài khoản mình tạo để đăng nhập
Với mỗi quyền khi đăng nhập thì sẽ ứng với những chức năng khác nhau
1.4.1.1 Hoạt động của khách hàng:
• Qui trình đăng kí: Mỗi khách hàng có thể đăng ký tài khoản khi điền đầy đủ các thông tin: Họ tên, số điện thoại, ngày sinh, địa chỉ, mail, mật khẩu
• Qui trình đăng nhập và quản lí thông tin cá nhân: Sau khi có tài khoản thì khách hàng đăng nhập vào trang web và có thể thực hiện các công việc: xem và chỉnh sửa thông tin cá nhân của mình, thay đổi mật khẩu,…
• Qui trình mua hàng: Sau khi đăng nhập thành công, khách hàng có thể tìm kiếm, xem thông chi tiết các sản phẩm của cửa hàng, xem phản hồi của những khách hàng khác về sản phẩm đó và lựa chọn sản phẩm kèm theo số lượng mình muốn mua
• Qui trình đặt hàng thanh toán: Sau khi chọn xong các sản phẩm, khách hàng tiến hành đặt hàng bằng cách điền các thông tin về: số điện thoại người nhận, địa chỉ giao hàng Thanh toán đơn hàng, khách hàng có thể lựa chọn một trong hai hình thức là: COD (thanh toán khi nhận hàng) và VNPAY (thanh toán bằng ví điện tử)
• Qui trình hủy đơn hàng: Sau khi đăng nhập và mua hàng thành công Khách hàng có thể hủy đơn đặt hàng nếu đơn đặt hàng đang ở trạng thái thích hợp để hủy và đơn hàng được hủy phải có hình thức thanh toán là COD
• Qui trình xác nhận đã nhận hàng: Sau khi giao hàng thành công, nhân viên cửa hàng sẽ gọi điện xác nhận với khách hàng đã giao hàng thành công để cập nhật trạng thái đơn hàng, khách hàng cũng có thể cập nhật trạng thái đơn hàng là ‘Đã nhận hàng’
• Qui trình phản hồi: Sau khi xác nhận đã nhận được hàng, khách hàng có thể phản hồi và chia sẻ ý kiến của mình về sản phẩm
1.4.1.2 Hoạt động của nhân viên (không phải quản lí)
• Qui trình đăng nhập và quản lí thông tin cá nhân: Sau khi có tài khoản của cửa hàng cung cấp thì nhân viên đăng nhập vào trang web và có thể thực hiện các công việc: xem và chỉnh sửa thông tin cá nhân của mình, thay đổi mật khẩu,…
• Qui trình quản lý sản phẩm: Sau khi đăng nhập vào trang web, nhân viên có thể tìm kiếm theo tên sản phẩm, theo dõi số lượng hiện có của sản phẩm và thực hiện cập nhật số lượng sản phẩm nếu cần
• Qui trình quản lý khách hàng: Sau khi đăng nhập vào trang web, nhân viên có thể xem thông tin khách hàng, theo dõi doanh số của khách hàng đã mua sắm tại cửa hàng Lọc ra danh sách các khách hàng theo: tên, địa chỉ, số điện thoại, mail
• Qui trình quản lý đơn đặt hàng: Sau khi đăng nhập vào trang web, nhân viên có thể theo dõi, xem chi tiết các đơn đặt hàng của khách hàng và cập nhật trạng thái của các đơn đặt hàng đó Đồng thời xuất hóa đơn của đơn hàng đó Lọc ra danh sách các đơn đặt hàng theo: Mã đơn đặt hàng, tên khách hàng
1.4.1.3 Hoạt động của nhân viên quản lý:
• Nhân viên quản lý có các hoạt động giống như của các nhân viên khác (1.4.1.2) Bên cạnh đó còn có những quy trình riêng
• Qui trình quản lý doanh thu: Sau khi đăng nhập vào trang web, quản lý có thể theo dõi và xem doanh thu theo tháng để có thể nắm được tình hình kinh doanh và cải thiện thêm
• Qui trình quản lý nhân viên: Sau khi đăng nhập vào trang web, quản lý có thể xem thông tin các nhân viên khác Lọc ra danh sách các nhân viên theo: mã nhân viên, tên nhân viên, địa chỉ, số điện thoại, mail Có thể thực hiện thêm nhân viên mới và xóa nhân viên
• Qui trình quản lý phản hồi: Sau khi đăng nhập vào trang web, quản lý có thể xem thông tin phản hồi của các khách hàng về các sản phẩm để nhìn nhận vấn đề, cải thiện những điều chưa tốt ở cửa hàng của mình và tiếp tục phát triển những điểm mạnh
• Lưu trữ thông tin giới thiệu của cửa hàng
• Lưu trữ thông tin khách hàng thành viên
• Lưu trữ thông tin nhân viên thuộc cửa hàng
• Lưu trữ thông tin sản phẩm
• Lưu trữ thông tin đơn hàng, chi tiết đơn hàng
• Lưu trữ lịch sử đơn hàng
• Lưu trữ thông tin phản hồi của khách hàng gửi đến
• Lưu trữ thông tin giỏ hàng
• Lưu trữ thông tin tài khoản đăng nhập vào hệ thống
• Tính toán tổng doanh thu theo tháng cho nhân viên quản lý
• Cập nhật tổng số lượng sản phẩm hiện tại của cửa hàng
• Tra cứu thông tin của khách hàng
• Tra cứu thông tin nhân viên thuộc cửa hàng
• Tra cứu thông tin sản phẩm
• Tra cứu thông tin đơn hàng
• Xuất danh sách các đơn hàng
1.4.3 Yêu cầu phi chức năng
• Hiệu suất: Xử lý dữ liệu nhanh, không mất quá nhiều thời gian đợi sẽ gây ra sự khó chịu cho khách hàng Hệ thống phải phản hồi thông tin cho người dùng nhanh, đưa ra các thông báo rõ ràng Các ngoại lệ xử lý chặt chẽ
THIẾT KẾ MÔ HÌNH QUAN HỆ
Mô hình thực thể mối kết hợp
Hình 2.1: Mô hình thực thể mối kết hợp
ER Diagram
Mô hình cơ sở dữ liệu quan hệ
EMPLOYEE(EMPLOYEE_ID, ADDRESS, BASE_SALARY, BIRTHDAY,
MAIL, FULLNAME, PHONE, USERPOSITION, START_DATE,
LOGIN_EMPLOYEE(USERLOGIN_ID, USERPASSWORD, USERNAME)
CUSTOMER(CUSTOMER_ID, ADDRESS, BIRTHDAY, MAIL, FULLNAME,
PHONE, TOTAL_PURCHASE_AMOUNT, USERLOGIN_ID)
PRODUCT(PRODUCT_ID, DESCRIPTION, PRODUCT_NAME,
NUTRITION_VALUE, ORIGIN, LINK_PHOTO, PRICE, QUANTITY,
CART(CART_ID, QUANTITY, CUSTOMER_ID, PRODUCT_ID)
ORDERS(ORDER_ID, ADDRESS_DELIVERY, ORDER_DATE,
ID_CHECKOUT, PAYMENT_METHOD, PHONE_RECEIVER, STATUS,
ORDER_DETAIL(ORDER_ID, PRODUCT_ID, QUANTITY)
CUSTOMER_FEEDBACK(FEEDBACK_ID, DATE_FEEDBACK,
DESCRIPTION, CUSTOMER_ID, PRODUCT_ID)
LOGIN_CUSTOMER(USERLOGIN_ID, USERNAME, USERPASSWORD)
Lưu ý: Không được sửa thuộc tính khóa chính
Giải thích các mối quan hệ và các thuộc tính của lược đồ:
Bảng mô tả quan hệ EMPLOYEE STT Tên thuộc tính Kiểu dữ liệu Ràng buộc Diễn giải
1 EMPLOYEE_ID Number(19,0) Khóa chính Mỗi nhân viên có 1 ID duy nhất để phân biệt với nhân viên khác
3 BASE_SALARY Number(11,2) Không bỏ trống Lương cơ bản theo tháng
4 BIRTHDAY Date Không bỏ trống Ngày sinh
5 MAIL Varchar2(100) Không bỏ trống,
Tên tài khoản Mail cũng chính là tên đăng nhập của nhân viên
6 FULLNAME Varchar2(50) Tên đầy đủ
7 PHONE Varchar2(25) Số điện thoại
8 USERPOSITION Varchar2(50) Manager / Employee Vị trí làm việc
9 START_DATE Date Không bỏ trống Ngày bắt đầu làm việc
10 USERLOGIN_ID Number(19,0) Khóa ngoại tham chiếu đến LOGIN_EMPLOYEE (USERLOGIN_ID)
ID tài khoản đăng nhập của nhân viên
11 MANAGER_ID Number(19,0) ID người quản lí
Bảng mô tả quan hệ LOGIN_EMPLOYEE STT Tên thuộc tính Kiểu dữ liệu Ràng buộc Diễn giải
1 USERLOGIN_ID Number(19,0) Khóa chính Mỗi tài khoản đăng nhập của nhân viên có
1 ID duy nhất để phân biệt với tài khoản của nhân viên khác
3 USERNAME Varchar2(255) Tên đăng nhập
Bảng mô tả quan hệ CUSTOMER STT Tên thuộc tính Kiểu dữ liệu Ràng buộc Diễn giải
1 CUSTOMER_ID Number(19,0) Khóa chính Mỗi khách hàng có 1
ID duy nhất để phân biệt với nhân viên khác
3 BIRTHDAY Date Không bỏ trống Ngày sinh
4 MAIL Varchar2(100) Không bỏ trống,
Tên tài khoản Mail cũng chính là tên đăng nhập của khách hàng
5 FULLNAME Varchar2(50) Tên đầy đủ
6 PHONE Varchar2(25) Số điện thoại
Number(11,2) Mặc định là 0 Tổng tiền mà khách hàng đã mua hàng tại cửa hàng
8 USERLOGIN_ID Number(19,0) Khóa ngoại tham chiếu đến LOGIN_CUSTOMER (USERLOGIN_ID)
ID tài khoản đăng nhập của khách hàng
Bảng mô tả quan hệ PRODUCT STT Tên thuộc tính Kiểu dữ liệu Ràng buộc Diễn giải
1 PRODUCT_ID Number(19,0) Khóa chính Mỗi sản phẩm có 1 ID để phân biệt với sản phẩm khác
2 DESCRIPTION Varchar2(2000) Mô tả sản phẩm
3 PRODUCT_NAME Varchar2(50) Tên sản phẩm
Varchar2(2000) Mô tả giá trị dinh dưỡng của sản phẩm
6 LINK_PHOTO Varchar2(500) Link ảnh để hiển thị
7 PRICE Number(11,2) Không bỏ trống Giá tiền
8 QUANTITY Number(10,0) Không bỏ trống Số lượng sản phẩm
9 PRODUCT_TYPE Varchar2(50) Loại sản phẩm
10 UNIT Varchar2(50) Không bỏ trống Đơn vị tính
Bảng mô tả quan hệ CART STT Tên thuộc tính Kiểu dữ liệu Ràng buộc Diễn giải
1 CART_ID Number(19,0) Khóa chính Khi mua hàng, mỗi sản phẩm và số lượng sản phẩm đó mà khách hàng mua sẽ có 1 ID để phân biệt với các sản phẩm khác và số lượng sản phẩm khác đó cùng được mua bởi khách hàng
2 QUANTITY Number(10,0) Số lượng sản phẩm mà khách hàng mua
3 CUSTOMER_ID Number(19,0) Khóa ngoại tham chiếu đến CUSTOMER(CUST OMER_ID)
4 PRODUCT_ID Number(19,0) Khóa ngoại tham chiếu đến PRODUCT(PRODU CT_ID)
Bảng mô tả quan hệ ORDERS STT Tên thuộc tính Kiểu dữ liệu Ràng buộc Diễn giải
1 ORDER_ID Number(19,0) Khóa chính Mỗi hóa đơn có 1 ID để phân biệt với các hóa đơn khác
Varchar2(100) Địa chỉ giao đơn hàng
3 ORDER_DATE Date Không bỏ trống Ngày hóa đơn
4 ID_CHECKOUT Number(19,0) ID thanh toán bằng ví điện tử (Là Null nếu thanh toán COD)
Varchar2(255) Phương thức thanh toán
Varchar2(255) Số điện thoại người nhận đơn hàng
8 TOTAL_MONEY Number(11,2) Thành tiền hóa đơn
9 CUSTOMER_ID Number(19,0) Khóa ngoại tham chiếu đến CUSTOMER(CUST OMER_ID)
Bảng mô tả quan hệ ORDER_DETAIL STT Tên thuộc tính Kiểu dữ liệu Ràng buộc Diễn giải
1 ORDER_ID Number(19,0) Khóa chính,
Khóa ngoại tham chiếu đến
2 PRODUCT_ID Number(19,0) Khóa chính,
Khóa ngoại tham chiếu đến
3 QUANTITY Number(10,0) Không bỏ trống Số lượng sản phẩm mua
Bảng mô tả quan hệ CUSTOMER_FEEDBACK STT Tên thuộc tính Kiểu dữ liệu Ràng buộc Diễn giải
1 FEEDBACK_ID Number(19,0) Khóa chính Mỗi phản hồi của khách hàng có 1 ID để phân biệt với các phản hồi khác
4 CUSTOMER_ID Number(19,0) Khóa ngoại tham chiếu đến CUSTOMER(CUST OMER_ID)
5 PRODUCT_ID Number(19,0) Khóa ngoại tham chiếu đến PRODUCT(PRODU CT_ID)
ID sản phẩm được đành giá
Bảng mô tả quan hệ LOGIN_CUSTOMER STT Tên thuộc tính Kiểu dữ liệu Ràng buộc Diễn giải
1 USERLOGIN_ID Number(19,0) Khóa chính Mỗi tài khoản đăng nhập của khách hàng có 1 ID để phân biệt với tài khoản của khách hàng khác
3 USERNAME Varchar2(255) Tên đăng nhập
Mô tả các qui định của hệ thống
2.4.1 Các ràng buộc toàn vẹn
Ràng buộc 1: MAIL của nhân viên chính là tên đăng nhập (USERNAME) của nhân viên đó (MAIL do cửa hàng cung cấp và nhân viên không được sửa)
Ràng buộc 2: MAIL của khách hàng cũng chính là tên đăng nhập (USERNAME) của khách hàng đó
Ràng buộc 3: Thuộc tính USERPOSITION trong bảng EMPLOYEE chỉ có thể có giá trị ‘EMPLOYEE’ hoặc ‘MANAGER’
Ràng buộc 4: Thuộc tính STATUS trong bảng ORDERS chỉ có thể có giá trị: Đã đặt hàng (ORDERED) hoặc đang chuẩn bị (PREPARING) hoặc đang vận chuyển
(SHIPPING) hoặc giao hàng thành công (COMPLETELY)
Ràng buộc 5: Thuộc tính BIRTHDAY trong bảng CUSTOMER phải là một ngày ở quá khứ hoặc hiện tại
Ràng buộc 6: Nhân viên làm việc tại cửa hàng ít nhất 18 tuổi
Ràng buộc 7: Quản lí cũng là một nhân viên
Ràng buộc 8: Trị giá (TOTAL_MONEY) của một đơn hàng bằng tổng
ORDER_DETAIL(QUANTITY) * PRODUCT(PRICE) các chi tiết đơn hàng của đơn hàng đó
Ràng buộc 9: Doanh số (TOTAL_PURCHASE_AMOUNT) của một khách hàng bằng tổng trị giá đơn hàng(TOTAL_MONEY) của khách hàng đó
2.4.2 Biểu diễn các ràng buộc toàn vẹn
Các đặc trưng của ràng buộc toàn vẹn:
• Bối cảnh: Những quan hệ có khả năng làm cho ràng buộc toàn vẹn bị vi phạm
• Nội dung: Phát biểu bằng ngôn ngữ hình thức
• Tầm ảnh hưởng: Bảng hai chiều, xác định các thao tác ảnh hưởng và thao tác không ảnh hưởng lên các quan hệ nằm trong bối cảnh
➢ Ký hiệu + : Có thể gây ra vi phạm ràng buộc toàn vẹn
➢ Ký hiệu - : Không thể gây ra vi phạm ràng buộc toàn vẹn
➢ Ký hiệu +(X) : Có thể gây ra vi phạm ràng buộc toàn vẹn khi thao tác trên thuộc tính X
➢ Ký hiệu -(*) : Không thể gây ra vi phạm ràng buộc toàn vẹn do thao tác không thực hiện được
2.4.2.1 Ràng buộc 1: MAIL của nhân viên chính là tên đăng nhập (USERNAME) của nhân viên đó (MAIL do cửa hàng cung cấp và nhân viên không được sửa)
• Bối cảnh: EMPLOYEE, LOGIN_EMPLOYEE
• Nội dung: emp ∈ EMPLOYEE, log ∈ LOGIN_EMPLOYEE: emp.USERLOGIN_ID = log USERLOGIN_ID emp.MAIL = log.USERNAME
2.4.2.2 Ràng buộc 2: MAIL của khách hàng cũng chính là tên đăng nhập (USERNAME) của khách hàng đó
• Bối cảnh: CUSTOMER, LOGIN_CUSTOMER
• Nội dung: cus ∈ CUSTOMER, log ∈ LOGIN_CUSTOMER: cus.USERLOGIN_ID = log USERLOGIN_ID cus.MAIL = log.USERNAME
2.4.2.3 Ràng buộc 3: Thuộc tính USERPOSITION trong bảng EMPLOYEE chỉ có thể có giá trị ‘EMPLOYEE’ hoặc ‘MANAGER’
• Nội dung: emp ∈ EMPLOYEE: emp.USERPOSITION = ‘EMPLOYEE emp.USERPOSITION = ‘MANAGER’
2.4.2.4 Ràng buộc 4: Thuộc tính STATUS trong bảng ORDERS chỉ có thể có giá trị: Đã đặt hàng (ORDERED) hoặc đang chuẩn bị (PREPARING) hoặc đang vận chuyển
(SHIPPING) hoặc giao hàng thành công (COMPLETELY)
• Nội dung: ord ∈ ORDERS: ord.STATUS = ‘ORDERED’ ord.STATUS
‘PREPARING’ ord.STATUS = ‘SHIPPING’ ord.STATUS
2.4.2.5 Ràng buộc 5: Thuộc tính BIRTHDAY trong bảng CUSTOMER phải là một ngày ở quá khứ hoặc hiện tại
• Nội dung: : cus ∈ CUSTOMER: cus.BIRTHDAY ≤ SYSDATE
2.4.2.6 Ràng buộc 6: Nhân viên làm việc tại cửa hàng ít nhất 18 tuổi
• Nội dung: emp ∈ EMPLOYEE: (SYSDATE - emp.BIRTHDAY) ≥ 18
2.4.2.7 Ràng buộc 7: Quản lí cũng là một nhân viên
• Nội dung: emp1 ∈ EMPLOYEE, emp1.MANAGER_ID ≠ NULL
!emp2 ∈ EMPLOYEE: emp1.MANAGER_ID emp2.MANAGER_ID
2.4.2.8 Ràng buộc 8: Trị giá (TOTAL_MONEY) của một đơn hàng bằng tổng
ORDER_DETAIL(QUANTITY) * PRODUCT(PRICE) các chi tiết đơn hàng của đơn hàng đó
• Bối cảnh: ORDERS, ORDER_DETAIL, PRODUCT
• Nội dung: ord ∈ ORDERS (ord.TOTAL_MONEY = (ord_detail ∈ ORDER_DETAIL: (ord_detail ORDER_ID = ord.ORDER_ID) , pro ∈ PRODUCT(pro.PRODUCT_ID = ord_detail.PRODUCT_ID): ord_detail.QUANTITY * pro.PRICE )
2.4.2.9 Ràng buộc 9: Doanh số (TOTAL_PURCHASE_AMOUNT) của một khách hàng bằng tổng trị giá đơn hàng(TOTAL_MONEY) của khách hàng đó
(ord ∈ ORDERS ord.CUSTOMER_ID = cus.CUSTOMER_ID ) ord.TOTAL_MONEY
XÂY DỰNG VÀ QUẢN LÝ CÁC GIAO TÁC
Trigger
Trigger là một đơn vị chương trình lưu trữ trong database và tự đông thực thi để đáp ứng một sự kiện nào đó Sự kiện này được kết hợp với một table, view, schema hoặc database và là một trong những sự kiện sau:
• Một câu lệnh DML: DELETING, INSERT, UPDATE
• Một câu lệnh DDL: CREATTE, ALTER, DROP
• Một tác vụ lên database: SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN
Trigger và ràng buộc (constraint) đều ràng buộc dữ liệu đầu vào nhưng trigger có thể tuân theo những quy tắc phức tạp mà constraint không thể
Cú pháp tạo trigger trong Oracle:
CREATE OR REPLACE TRIGGER ten_trigger
{DELETE, INSERT, UPDATE [OF ten_cot … ]}
Thuc thi cac cau lenh SQL;
• {BEFORE | AFTER}: Thời gian kích hoạt trigger, xử lý hành động trước(BEFORE) hay sau(AFTER) khi thực hiện thay đổi trên bảng dữ liệu
• {DELETE, INSERT, UPDATE [OF ten_cot … ]}: Sự kiện kích hoạt trigger
• ON ten_bang: Trình kích hoạt phải được liên kết với một bảng cụ thể, sử dụng từ khóa ON để xác định
• [FOR EACH ROW]: trigger sẽ thực thi trên từng dòng
Danh sách các trigger có trong hệ thống:
Bảng danh sách các trigger
1 BIRTHDAY_CUS_VALID Kiểm tra ngày sinh (BIRTHDAY) của khách hàng phải bé hơn hoặc bằng ngày hiện tại
2 CHECK_AGE_EMPLOYEE Kiểm tra độ tuổi của nhân viên làm việc tại cửa hàng phải lớn hơn hoặc bằng 18 tuổi
3 MANAGERID_IS_EMPLOYEEID Kiểm tra người quản lí cũng là một nhân viên
4 LOGIN_EMP_AUTO Sau khi thêm một nhân viên thì thông tin login của nhân viên đó sẽ được tạo tự động
5 UPDATE_QUANTITY_PRODUCT Khi thêm hoặc xóa một chi tiết hóa đơn thì cập nhật lại số lượng hiện có của sản phẩm
Thao tác: INSERT OR UPDATE OF BIRTHDAY
Nội dung: Kiểm tra ngày sinh (BIRTHDAY) của khách hàng phải bé hơn hoặc bằng ngày hiện tại
Hình 3.1.1: trigger BIRTHDAY_CUS_VALID
1 Lấy giá trị thuộc tính BIRTHDAY
2 Nếu BIRTHDAY bé hơn hoặc bằng ngày hiện tại thì thông báo thành công và kết thúc Ngược lại thì qua bước 3
3 Thông báo lỗi và kết thúc
Thao tác: INSERT OR UPDATE OF BIRTHDAY
Nội dung: Kiểm tra độ tuổi của nhân viên làm việc tại cửa hàng phải lớn hơn hoặc bằng
Hình 3.1.2: trigger CHECK_AGE_EMPLOYEE
1 Tách giá trị năm trong thuộc tính BIRTHDAY
2 Thực hiện kiểm tra có đủ 18 tuổi không Nếu có thì thông báo thành công và kết thúc Ngược lại thì qua bước 3
3 Thông báo không thành công và kết thúc
Nội dung: Kiểm tra người quản lí cũng là một nhân viên
Hình 3.1.3: trigger MANAGER_IS_EMPLOYEEID
1 Khai báo biến con trỏ v_EMPLOYEE_ID_LIST để tham chiếu đến các ID của nhân viên (EMPLOYEE_ID), v_EMPLOYEE_ID để lưu giá trị EMPLOYEE_ID của nhân viên, v_check để kiểm tra
2 Mỗi khi vòng lặp duyệt qua từng dòng mà v_EMPLOYEE_ID_LIST tham chiếu đến thì gán EMPLOYEE_ID cho biến v_EMPLOYEE_ID và so sánh
MANAGER_ID có bằng v_EMPLOYEE_ID
2.1 Nếu bằng nhau thì gán v_check = 1 và thoát khỏi vòng lặp Ngược lại qua bước 2.2
2.2 Nếu không bằng nhau thì tiếp tục lặp
3.1 Nếu v_check khác 1 thì thông báo lỗi và kết thúc chương trình Ngược lại thì qua bước 3.2
3.2 Thông báo hợp lệ và kết thúc chương trình 3.1.2.3 LOGIN_EMP_AUTO
Nội dung: Trước khi thêm một nhân viên thì thông tin login của nhân viên đó sẽ được tạo tự động
Hình 3.1.4: trigger MANAGER_IS_EMPLOYEEID
1 Khai báo biến v_USERLOGIN_ID để lưu trữ giá thuộc tính USERLOGIN_ID của nhân viên
2 Gán giá trị tiếp theo của chuỗi số LOGIN_EMPLOYEE_ID_AUTO cho biến v_USERLOGIN_ID
3 Thêm một bản ghi vào bảng dữ liệu LOGIN_EMPLOYEE các giá trị v_USERLOGIN_ID, mật khẩu(USERPASSWORD) mặc định, tên đăng nhập
(USERNAME) chính là MAIL của nhân viên đó
4 Gán v_USERLOGIN_ID cho thuộc tính EMPLOYEE_ID trong bảng
3.1.3 Trigger trên bảng ORDER_DETAIL
Tên trigger: UPDATE_QUANTITY_PRODUCT
Thao tác: INSERT OR DELETE
Nội dung: Khi thêm hoặc xóa một chi tiết đơn hàng thì cập nhật lại số lượng hiện có của sản phẩm
Hình 3.1.5: trigger UPDATE_QUANTITY_PRODUCT
1 Khai báo biến v_current_quantity để lưu số lượng hiện có của sản phẩm
2 Kiểm tra thao tác là INSERT hay DELETE
2.1 Nếu thao tác là INSERT thì thực hiện trừ số lượng sản phẩm hiện có trong bảng PRODUCT với PRODUCT_ID tương ứng PRODUCT_ID trong bảng ORDER_DETAIL Sau đó gán số lượng sản phẩm hiện có cho biến v_current_quantity Kiểm tra v_current_quantity
2.1.1 Nếu bé hơn 0 thì thông báo lỗi sản phẩm không đủ Ngược lại qua bước 2.1.2
2.2 Nếu thao tác là DELETE thì thực hiện cộng thêm vào số lượng sản phẩm hiện có trong bảng PRODUCT với PRODUCT_ID tương ứng
PRODUCT_ID trong bảng ORDER_DETAIL
Các chương trình con được sử dụng trong hệ thống
• Một chương trình con chính là một khối lệnh PL/SQL được đặt tên và được gọi với một tập các đối số Nó được lưu trong cơ sở dữ liệu như các đối tượng cơ sở dữ liệu
• Một chương trình con có thể là một thủ tục (Procedure) hoặc là một hàm
• Các loại đối số trong chương trình con:
• Đối số IN: cho phép truyền giá trị tới chương trình con, nó hoạt động như một hằng số và không được gán giá trị trong một chương trình con Nó có thể được khởi tạo một giá trị mặc định
• Đối số OUT: trả về giá trị tới môi trường gọi nó Đối số này hoạt động như là một biến trong chương trình con Có thể thay đổi giá trị của nó và sử dụng giá trị này sau khi gán
• Đối số IN OUT: truyền giá trị khởi tạo tới chương trình con và trả về một giá trị mới cho môi trường gọi nó Đối số này phải là một biến, không được là hằng số hay một biểu thức
• Nếu không chỉ rõ thì mặc định trong Oracle là đối số IN
• Thường được sử dụng chủ yếu để thực hiện quy trình nhất định
• Gọi đến các Procedure có thể được thực hiện bằng cách đề cập đến tên của chúng
• Nó chứa một phần khai báo (tùy chọn), phần thực thi, phần xử lý ngoại lệ (tùy chọn)
• Các giá trị có thể được truyền vào hoặc lấy từ các thủ tục thông qua các tham số
• Không thể được gọi trực tiếp từ câu lệnh SELECT, chúng có thể được gọi từ khối khác
• Không bắt buộc trả về giá trị
• Thủ tục có thể có RETURN để trả lại quyền kiểm soát cho khối gọi nó, nhưng nó không thể trả về bất kỳ giá trị thông qua RETURN
• Cú pháp Procedure trong Oracle:
CREATE OR REPLACE PROCEDURE ten_thu_tuc
Tham so truyen vao thu tuc thamso1 IN/OUT/IN OUT ,
Thuc thi cac cau lenh PL/SQL
3.2.1.1 Thủ tục CHECK_MAIL_CUS_EXIST
Nội dung: Kiểm tra mail của khách hàng đã tồn tại chưa để hỗ trợ việc đăng kí và đăng nhập
Tham số đầu vào: i_MAIL
Tham số đầu ra: v_MAIL
Hình 3.2.1: Thủ tục CHECK_MAIL_CUS_EXIST
1 Dựa vào tham số IN i_MAIL để kiểm tra giá trị này đã tồn tại chưa Nếu chưa tồn tại thì qua bước 2 Ngược lại qua bước 3
2 Tham số OUT v_MAIL có giá trị NULL được trả về cho chương trình gọi nó
3 Tham số OUT v_MAIL có giá trị khác NULL được trả về cho chương trình gọi nó
Nội dung: Khách hàng đăng kí tài khoản
Tham số đầu vào: i_FULLNAME, i_ADDRESS, i_PHONE, i_BIRTHDAY, i_MAIL, i_PASSWORD
Hình 3.2.2: Thủ tục CUSTOMER_REGISTER
1 Khai báo biến v_USERLOGIN_ID để thêm ID đăng nhập vào bảng
2 Thêm thông tin đăng nhập của khách hàng vào bảng LOGIN_CUSTOMER thông qua câu lệnh INSERT
3 Thêm thông tin khách hàng vào bảng CUSTOMER thông qua câu lệnh INSERT
Nội dung: Hiển thị trên giao diện các sản phẩm để khách hàng mua hàng
Tham số đầu vào: i_product_type
Tham số đầu ra: v_PRODUCT
Hình 3.2.3: Thủ tục SHOW_PRODUCT
1 Tham số OUT v_PRODUCT được khai báo là kiểu con trỏ để truy xuất các sản phẩm có thuộc tính PRODUCT_TYPE có giá trị là i_product_type Nếu chưa tồn tại thì qua bước 2 Ngược lại thì qua bước 3
2 Tham số OUT v_PRODUCT với giá trị NULL trả về cho chương trình gọi nó
3 Tham số OUT v_PRODUCT trả về cho chương trình gọi nó danh sách các sản phẩm
Nội dung: Cập nhật số lượng sản phẩm của giỏ hàng đó tăng 1 hoặc giảm 1 khi khách hàng nhấn vào nút + hoặc nút – trên giao diện
Tham số đầu vào: i_CART_ID, i_QUANTITY
Hình 3.2.4: Thủ tục UPDATE_CART
1 Kiểm tra xem giỏ hàng có ID là i_CART_ID có tồn tại không Nếu có thì qua bước 2 Ngược lại qua bước 6
2 Lấy số lượng hiện có trong kho của sản phẩm đó trong giỏ hàng
3 Thực hiện việc tăng/giảm số lượng sản phẩm đang có của giỏ hàng đó lên/xuống 1 đơn vị (số lượng muốn mua) và gán vào một biến
4 So sánh số lượng sản phẩm ở bước 3 và bước 2 Nếu số lượng muốn mua lớn hơn số lượng hiện có thì thông báo lỗi và kết thúc Ngược lại qua bước 5
5 Thực hiện cập nhật số lượng sản phẩm đang có của giỏ hàng đó và xác nhận
6 Thông báo không tồn tại và kết thúc
3.2.1.5 Thủ tục UPDATE_VALUE_QUANTITY_OF_CART
Nội dung: Cập nhật số lượng sản phẩm của giỏ hàng đó khi khách hàng nhập vào số lương mong muốn
Tham số đầu vào: i_CART_ID, i_QUANTITY
Hình 3.2.5: Thủ tục UPDATE_VALUE_QUANTITY_OF_CART
1 Kiểm tra xem giỏ hàng có ID là i_CART_ID có tồn tại không Nếu có thì qua bước 2 Ngược lại qua bước 5
2 Lấy số lượng hiện có trong kho của sản phẩm đó trong giỏ hàng
3 So sánh số lượng hiện có trong kho và số lượng muốn mua (tham số IN i_QUANTITY) Nếu số lượng muốn mua lớn hơn số lượng hiện có thì thông báo lỗi và kết thúc Ngược lại qua bước 4
4 Thực hiện cập nhật số lượng sản phẩm đang có của giỏ hàng đó và xác nhận
5 Thông báo không tồn tại và kết thúc
3.2.1.6 Thủ tục FIND_LIST_CART
Nội dung: Liệt kê các giỏ hàng của khách hàng để tạo đơn hàng
Tham số đầu vào: i_CUSTOMER_ID
Tham số đầu ra: v_LIST
Hình 3.2.6: Thủ tục FIND_LIST_CART
1 Tham số OUT v_LIST được khai báo là kiểu con trỏ để truy xuất các giỏ hàng của khách hàng đó Nếu chưa tồn tại thì qua bước 2 Ngược lại qua bước 3
2 Tham số OUT v_LIST với giá trị NULL trả về cho chương trình gọi nó
3 Tham số OUT v_LIST trả về cho chương trình gọi nó danh sách các giỏ hàng của khách hàng
3.2.1.7 Thủ tục ADD_ORDER_ORDERDETAIL
Nội dung: Tạo đơn hàng và các chi tiết đơn hàng từ các giỏ hàng của khách hàng (Stored
Tham số đầu vào: i_CUSTOMER_ID, i_ADDRESS_DELIVERY, i_ORDER_ID
Hình 3.2.7: Thủ tục ADD_ORDER_ORDERDETAIL
1 Kiểm tra khách hàng có ID là i_CUSTOMER_ID có tồn tại không Nếu có thì qua bước 2 Ngược lại qua bước 9
2 Gọi Procedure FIND_LIST_CART(i_CUSTOMER_ID, v_LIST) để xác định các giỏ hàng của khách hàng đó
3 Tính tổng giá trị của đơn hàng
4 Thêm một đơn hàng vào bảng ORDERS thông qua câu lệnh INSERT
5 Cập nhật doanh số khách hàng đó thông qua câu lệnh UPDATE
6 Con trỏ v_LIST truy xuất được danh sách các giỏ hàng của khách hàng này dựa vào gọi procedure ở bước 2
7 Lặp qua từng dòng của giỏ hàng để thêm một chi tiết đơn hàng vào bảng
ORDER_DETAIL thông qua câu lệnh INSERT, đồng thời xóa giỏ hàng này thông qua câu lệnh DELETE
9 Thông báo không tồn tại và kết thúc
3.2.1.8 Thủ tục CHECK_MAIL_EMP_EXIST
Nội dung: Kiểm tra mail của nhân viên đã tồn tại chưa để hỗ trợ việc thêm nhân viên và đăng nhập
Tham số đầu vào: i_MAIL
Tham số đầu ra: v_MAIL
Hình 3.2.8: Thủ tục CHECK_MAIL_EMP_EXIST
1 Dựa vào tham số IN i_MAIL để kiểm tra giá trị này đã tồn tại chưa Nếu chưa tồn tại thì qua bước 2 Ngược lại qua bước 3
2 Tham số OUT v_MAIL có giá trị NULL được trả về cho chương trình gọi nó
3 Tham số OUT v_MAIL có giá trị khác NULL được trả về cho chương trình gọi nó
Nội dung: Lọc ra danh sách các khách hàng dựa vào thông tin tìm kiếm được nhập vào Tham số đầu vào: i_text
Tham số đầu ra: v_CUSTOMER
Hình 3.2.9: Thủ tục FIND_CUSTOMER
1 Tham số OUT v_CUSTOMER được khai báo là kiểu con trỏ để truy xuất các khách hàng có thông tin trùng với thông tin cần tìm Nếu chưa tồn tại thì qua bước 2 Ngược lại qua bước 3
2 Tham số OUT v_CUSTOMER với giá trị NULL trả về cho chương trình gọi nó
3 Tham số OUT v_CUSTOMER trả về cho chương trình gọi nó danh sách các khách hàng phù hợp
Nội dung: Lọc ra danh sách các nhân viên dựa vào thông tin tìm kiếm được nhập vào Tham số đầu vào: i_text
Tham số đầu ra: v_EMPLOYEE
Hình 3.2.10: Thủ tục FIND_EMPLOYEE
1 Tham số OUT v_EMPLOYEE được khai báo là kiểu con trỏ để truy xuất các nhân viên có thông tin trùng với thông tin cần tìm Nếu chưa tồn tại thì qua bước 2
2 Tham số OUT v_EMPLOYEE với giá trị NULL trả về cho chương trình gọi nó
3 Tham số OUT v_EMPLOYEE trả về cho chương trình gọi nó danh sách các nhân viên phù hợp
Nội dung: Lọc ra danh sách các đơn hàng dựa vào ID đơn hàng hoặc tên khách hàng Tham số đầu vào: i_text
Tham số đầu ra: v_ORDER
Hình 3.2.11: Thủ tục FIND_ORDER
1 Kiểm tra i_text có thể chuyển đổi thành số được hay không Nếu không có thì qua bước 2 Ngược lại qua bước 3
2 Đặt giá trị v_id là NULL nếu không phải là số
3 Dùng con trỏ v_ORDER để truy xuất thông tin các đơn hàng phù hợp, đồng thời sắp xếp theo ID tăng dần Nếu không truy xuất đơn hàng phù hợp thì qua bước 4 Ngược lại kết thúc
4 Trả về v_ORDER với giá trị NULL được trả về cho chương trình gọi nó và kết thúc
Nội dung: Hỗ trợ khách hàng tìm kiếm sản phẩm
Tham số đầu vào: i_text
Tham số đầu ra: v_PRODUCT
Hình 3.2.12: Thủ tục FIND_PRODUCT
1 Tham số OUT v_PRODUCT được khai báo là kiểu con trỏ để truy xuất các sản phẩm có thông tin trùng với thông tin cần tìm Nếu chưa tồn tại thì qua bước 2 Ngược lại qua bước 3
2 Tham số OUT v_PRODUCT với giá trị NULL trả về cho chương trình gọi nó
3 Tham số OUT v_PRODUCT trả về cho chương trình gọi nó danh sách các sản phẩm phù hợp
3.2.1.13 Thủ tục FIND_ALL_ORDER
Nội dung: Danh sách các đơn hàng được liệt kê với ID tăng dần
Tham số đầu ra: v_ORDERS
Hình 3.2.13: Thủ tục FIND_ALL_ORDER
1 Tham số OUT v_ORDERS được khai báo là kiểu con trỏ để truy xuất ra các đơn hàng với ID tăng dần và trả về cho chương trình gọi nó danh sách các đơn hàng với
3.2.1.14 Thủ tục FIND_ORDER_COMPLETELY
Nội dung: Hiển thị các đơn hàng đã giao hàng thành công
Tham số đầu vào: i_CUSTOMER_ID
Tham số đầu ra: v_ORDER
Hình 3.2.14: Thủ tục FIND_ORDER_COMPLETELY
1 Tham số OUT v_ORDER được khai báo là kiểu con trỏ để truy xuất ra các đơn hàng của khách hàng mà đã được giao thành công và hiển thị theo ngày đặt hàng giảm dần Nếu không tồn tại thì qua bước 2 Ngược lại qua bước 3
2 Tham số OUT v_ORDER với giá trị NULL trả về cho chương trình gọi nó
3 Tham số OUT v_ORDER trả về cho chương trình gọi nó danh sách các đơn hàng phù hợp
3.2.1.15 Thủ tục FIND_ORDER_NOT_DELIVERED
Nội dung: Hiển thị các đơn hàng chưa giao hàng thành công
Tham số đầu vào: i_CUSTOMER_ID
Tham số đầu ra: v_ORDER
Hình 3.2.15: Thủ tục FIND_ORDER_NOT_DELIVERED
1 Tham số OUT v_ORDER được khai báo là kiểu con trỏ để truy xuất ra các đơn hàng của khách hàng mà chưa được giao thành công và hiển thị theo ngày đặt hàng giảm dần Nếu không tồn tại thì qua bước 2 Ngược lại qua bước 3
2 Tham số OUT v_ORDER với giá trị NULL trả về cho chương trình gọi nó
3 Tham số OUT v_ORDER trả về cho chương trình gọi nó danh sách các đơn hàng phù hợp
3.2.1.16 Thủ tục UPDATE_STATUS_ORDERS
Nội dung: Cập nhật trạng thái của một đơn hàng
Tham số đầu vào: i_ORDER_ID
Hình 3.2.16: Thủ tục UPDATE_STATUS_ORDERS
1 Kiểm tra đơn hàng có ID là i_ORDER_ID đang ở trạng thái nào Nếu không tồn tại thì qua bước 4 Ngược lại thì qua bước 2
2 Tùy vào trạng thái hiện tại của đơn hàng thì sẽ được cập nhật lên một bậc trạng thái tiếp theo thích hợp
4 Thông báo không hợp lệ và kết thúc
Nội dung: Khách hàng có thể hủy đơn hàng của mình nếu đơn hàng đang ở trạng thái có thể được hủy
Tham số đầu vào: i_ORDER_ID
Hình 3.2.17: Thủ tục DELETE_ORDER
1 Kiểm tra đơn hàng có ID là i_ORDER_ID có tồn tại không Nếu không tồn tại thì qua bước 4 Ngược lại thì qua bước 2
2 Kiểm tra trạng thái của đơn hàng có thích hợp để hủy không
Giao tác (Transaction)
3.3.1 Tổng quan về giao tác trong Oracle
• Một giao tác gồm một hoặc nhiều câu lệnh SQL, được thực thi bởi một người dùng đơn
• Giao tác bắt đầu bằng việc thực thi câu lệnh SQL đầu tiên của người dùng và kết thúc khi gặp một trong những trường hợp sau: o Gặp câu lệnh COMMIT hoặc ROLLBACK mà không có một điểm đánh dấu SAVEPOINT o Chạy một câu lệnh DDL : CREATE, DROP, ALTER, RENAME o Người dùng ngắt kết nối với Oracle o Xử lý người dùng bị ngắt một cách bất thường Giao tác hiện tại sẽ bị rollback
• Các câu lệnh kiểm soát giao tác: o COMMIT: Các thay đổi trong giao dịch đó sẽ được áp dụng vĩnh viễn lên cơ sở dữ liệu và các giao dịch hoặc người dùng khác có thể nhìn thấy những thay đổi đó o ROLLBACK: Quay ngược lại những thay đổi của giao tác, tính từ lúc giao tác bắt đầu hoặc từ một điểm SAVEPOINT SAVEPOINT là một điểm được người dùng khai báo trong phạm vi giao tác, nó chia một giao tác thành các phần nhỏ hơn và thực hiện ROLLBACK từ điểm SAVEPOINT này sẽ hoàn tác các thay đổi trong phạm vi từ điểm SAVEPOINT đó trở đi
• Giao tác thường được sử dụng trong các tình huống như : o Khi có nhiều dòng dữ liệu cần được chỉnh sửa và nếu quá trình thực hiện gặp lỗi tại một dòng nào đó, thì toàn bộ công việc chỉnh sửa tại các dòng dữ liệu này sẽ được coi như thất bại và sẽ được hoàn tác Trong trường hợp này, transaction đảm bảo tính nhất quán của dữ liệu trong cơ sở dữ liệu o Khi chỉnh sửa thông tin của một bảng và bảng này có ánh xạ thông tin tới nhiều bảng khác Đối với các hệ quản trị cơ sở dữ liệu quan hệ, transaction đảm bảo tính nhất quán của dữ liệu khi thực hiện các thay đổi liên quan đến nhiều bảng, đồng thời đảm bảo rằng các thay đổi sẽ được áp dụng hoàn toàn hoặc không áp dụng chúng o Khi nhiều cơ sở dữ liệu cần được chỉnh sửa thông tin cùng một thời điểm Trong môi trường phân tán, transaction được sử dụng để đồng bộ hóa các thay đổi dữ liệu trên nhiều cơ sở dữ liệu khác nhau, đảm bảo tính nhất quán của hệ thống o Khi nhiều dữ liệu bị thay đổi trong cơ sở dữ liệu từ nhiều máy chủ khác nhau Trong trường hợp này, transaction đảm bảo tính nhất quán của dữ liệu bằng cách đồng bộ hóa các thay đổi và đảm bảo rằng các thay đổi sẽ được áp dụng một cách đồng nhất trên tất cả các máy chủ
• Hàng đợi giao tác : Khi một transaction đang đợi tài nguyên bị khóa, nó sẽ bị chặn (block) và được đưa vào hàng đợi của transaction đang giữ tài nguyên đó
Transaction đang giữ tài nguyên phải tiến hành COMMIT (hoàn thành) hoặc ROLLBACK (hủy bỏ) để cho phép transaction bị khóa tiếp tục thực thi
• AUTONOMOUS TRANSACTION: Đây là một loại giao tác độc lập có thể được gọi từ giao tác chính Giao tác autonomous có khả năng tạm dừng giao tác chính, thực hiện các câu lệnh SQL và sau đó tiến hành COMMIT hoặc ROLLBACK trong giao tác autonomous Sau khi hoàn thành, giao tác chính có thể tiếp tục thực thi Giao tác này có các đặc điểm như: o Độc lập: Giao tác autonomous hoạt động độc lập với giao tác chính và có thể thực hiện các thao tác SQL mà không bị ảnh hưởng bởi giao tác chính o Tạm dừng và tiếp tục: Giao tác chính có thể tạm dừng để gọi giao tác autonomous, sau đó tiếp tục thực thi giao tác chính sau khi giao tác autonomous hoàn thành o COMMIT và ROLLBACK: Giao tác autonomous có khả năng thực hiện
COMMIT hoặc ROLLBACK để xác nhận hoặc hủy bỏ các thay đổi dữ liệu đã được thực hiện trong giao tác đó
• Câu lệnh “PRAGMA AUTONOMOUS_TRANSACTION” chỉ thị cho cơ sở dữ liệu rằng giao dịch này khi được thực hiện sẽ thực hiện như một giao dịch mới độc lập với giao dịch chính
Hình 3.3.1 Luồng kiểm soát giao dịch giữa giao dịch chính và autonomous transaction
3.3.2 Tổng quan về giao tác trong Java (Spring Boot) Để bắt đầu một giao tác trong Java Spring Boot, người dùng sẽ bắt đầu thao tác trên web Lúc này sẽ có một yêu cầu gửi về Spring Boot để thực hiện giao tác trong Controller tương ứng (GetMapping, PostMapping) Khi thực hiện xong các phương thức trong controller tương ứng thì sẽ kết thúc giao tác hoặc có các câu lệnh kết thúc giao tác
Hình 3.3.2: Giao tác trong Java Spring Boot
XỬ LÝ TRUY XUẤT ĐỒNG THỜI
Tìm hiểu về các phương thức khóa cơ bản
• Để ngăn chặn tình trạng xung đột có thể xảy ra khi có nhiều giao tác truy xuất đồng thời, Oracle đặt ra các cơ chế lock dữ liệu
• Mặc định, Oracle sẽ tự động lock dữ liệu khi cần thiết mà không cần tới sự can thiệp của người dùng (lock ngầm định) Khi xảy ra việc này thì Oracle luôn chọn cấp độ lock thấp nhất có thể có
• Oracle cũng cung cấp các câu lệnh để người dùng có thể tự lock dữ liệu khi cần gọi là lock xác định
• Oracle đảm bảo dữ liệu đồng thời, nhất quán và toàn vẹn giữa các giao dịch thông qua cơ chế khóa Cơ chế khóa diễn ra tự động và không cần sự can thiệp của người dùng
• Các giao tác trước khi muốn đọc lên một đơn vị dữ liệu phải phát ra một yêu cầu xin khóa đơn vị dữ liệu đó Yêu cầu này được bộ phận quản lý khóa xử lí
• Yêu cầu được chấp thuận thì giao tác được phép đọc lên đơn vị dữ liệu đó
• Read Lock có thể được thiết lập trên một bảng, một trang, một khóa hay trên một dòng dữ liệu
• Nhiều giao tác có thể đồng thời giữ Read Lock trên cùng một đơn vị dữ liệu
• Read Lock có thể được giải phóng sau khi đọc xong dữ liệu hoặc sau khi hết giao tác
• Bất cứ khi nào thực thi một câu truy vấn, Oracle sẽ thực thi ‘Tính nhất quán đọc ở cấp độ câu lệnh ’(Statement-level read Consistency) nghĩa là người dùng sẽ nhận được dữ liệu từ thời điểm người dùng truy vấn, người dùng sẽ chỉ thấy dữ liệu được cam kết trước khi bắt đầu truy vấn của mình
• Các giao tác trước khi muốn ghi lên một đơn vị dữ liệu phải phát ra một yêu cầu xin khóa đơn vị dữ liệu đó Yêu cầu này được bộ phận quản lý khóa xử lí
• Yêu cầu được chấp thuận thì giao tác được phép ghi lên đơn vị dữ liệu đó
• Tại một thời điểm, chỉ có một giao tác được quyền giữ Write Lock trên một đơn vị dữ liệu
• Không thể thiết lập Write Lock trên đơn vị dữ liệu đang có Read Lock
• Write Lock luôn được giữ cho khi đến hết giao tác.
Các mức cô lập có trong hệ quản trị cơ sở dữ liệu Oracle
• Đây là mức cô lập mặc định của Oracle
• Tạo Read Lock trên đơn vị dữ liệu được đọc, được giải phóng ngay sau khi đọc xong dữ liệu
• Tạo Write Lock trên đơn vị dữ liệu được ghi, được giải phóng ngay khi kết thúc giao tác
• Ưu điểm: Mức cô lập này giải quyết được vấn đề đọc dữ liệu bẩn của giao tác vì nó chỉ đọc được dữ liệu khi giao tác trước xác nhận Đồng thời, giao tác ở mức cô lập này không cản trở nhiều đến thao tác ghi của các giao tác khác vì nó không giữ khóa đọc cho đến hết giao tác
• Nhược điểm: Chưa giải quyết được vấn đề về mất dữ liệu cập nhật (Lost Update), đọc không thể lặp lại (Non repeatable read), bóng ma (Phantom read) Giao dịch ở mức cô lập này phải chờ nếu đơn vị dữ liệu cần đọc đang được giữ khóa ghi
• Giao tác sẽ ngăn việc sửa đổi bản ghi gọi là giao dịch chặn (blocking transaction)
• Giao dịch chặn là tình huống xảy ra khi một giao dịch đang giữ khóa (lock) trên một tài nguyên và ngăn chặn các giao dịch khác thực hiện các thao tác trên tài nguyên đó cho đến khi khóa được giải phóng Trong khi một giao dịch đang chặn, các giao dịch khác phải chờ đợi và không thể tiếp tục thực thi cho đến khi khóa được giải phóng
• Đây là mức cô lập cao nhất Giao tác chỉ thấy những thay đổi đã được commit trước thời điểm mà giao tác ở mức cô lập này bắt đầu và các thay đổi được thực hiện bởi chính giao tác này
• Các giao tác hoàn toàn tách biệt với nhau, hoạt động trong một môi trường như chỉ có một mình nó Khi giao tác ở mức cô lập này đọc hoặc ghi dữ liệu Read Lock hoặc Write Lock đó được giữ hết khi giao tác kết thúc
• Ở mức cô lập này, nó tránh được tất cả các vấn đề khi xảy ra giao dịch đồng thời mà mức cô lập trên chưa giải quyết được vì bất kì truy vấn nào cũng được đảm bảo trả về cùng kết quả trong suốt thời gian mà giao dịch hoạt động
• Trong quá trình thực thi, nếu giao dịch ở mức cô lập này thực hiện việc thay đổi một dòng dữ liệu đã được thay đổi bởi một giao dịch khác và đã được xác nhận sau khi giao dịch tuần tự bắt đầu thực thi thì sẽ xảy ra xung đột và lỗi được ném ra là :
• Giao dịch ở mức cô lập này giống với giao dịch ở mức cô lập Serializable, nhưng không được thực hiện bất kì việc chỉnh sửa nào trên cơ sở dữ liệu mà chỉ được đọc dữ liệu (người dùng sys vẫn được phép chỉnh sửa).
Các vấn đề truy xuất đồng thời trong đồ án môn học
Mô tả tình huống: Nhân viên A đang xem các thông tin đơn hàng của khách hàng B thì khách hàng B thực hiện việc hủy đơn hàng của mình Khi nhân viên A xuất báo cáo thì thấy dữ liệu đã thay đổi
Bảng mô tả tình huống Phantom read:
Session 1 thiết lập mức cô lập là Read Committed
DECLARE v_ORDER SYS_REFCURSOR; o_ID NUMBER(19,0); o_ADDRESS VARCHAR2(100); o_DATE DATE; o_STATUS VARCHAR2(50); o_TOTAL NUMBER(11,2); c_ID NUMBER(19,0);
FIND_ORDER('Ly Tran Anh Qui', v_ORDER);
DBMS_OUTPUT.PUT_LINE('~Thong tin~');
FETCH v_ORDER INTO o_ID, o_ADDRESS, o_DATE, o_STATUS, o_TOTAL, c_ID;
DBMS_OUTPUT.PUT_LINE('ORDER_ID: ' || o_ID || CHR(10) || 'ADDRESS: ' || o_ADDRESS
' || o_TOTAL || CHR(10) || 'CUS_ID: ' || c_ID||
Session 1 thực hiện thao tác truy vấn thông tin các đơn hàng của khách hàng có tên
PL/SQL procedure successfully completed
PL/SQL procedure successfully completed
Session 2 thực hiện việc hủy đơn hàng có ID là 2
Session 2 thực hiện xong và kết thúc
DECLARE v_ORDER SYS_REFCURSOR; o_ID NUMBER(19,0); o_ADDRESS VARCHAR2(100); o_DATE DATE; o_STATUS VARCHAR2(50); o_TOTAL NUMBER(11,2); c_ID NUMBER(19,0);
FIND_ORDER('Ly Tran Anh Qui', v_ORDER);
DBMS_OUTPUT.PUT_LINE('~~Thong tin~~');
FETCH v_ORDER INTO o_ID, o_ADDRESS, o_DATE, o_STATUS, o_TOTAL, c_ID;
DBMS_OUTPUT.PUT_LINE('ORDER_ID: ' || o_ID || CHR(10) || 'ADDRESS: ' || o_ADDRESS
' || o_TOTAL || CHR(10) || 'CUS_ID: ' || c_ID||
Session 1 thực hiện thao tác truy vấn thông tin các đơn hàng của khách hàng có tên
‘Le Tran Anh Qui’ thì thấy thông tin đã thay đổi
• Nguyên nhân: Session 1 đang có mức cô lập mặc định là Read Committed nên mỗi lần đọc trên một đơn vị dữ liệu thì nó sẽ đọc từ cơ sở dữ liệu lên Lần đọc sau thì cơ sở dữ liệu đã bị thay đổi dẫn đến việc đọc ra kết quả khác với lần đọc đầu tiên mặc dù vẫn đọc trên những đơn vị dữ liệu giống nhau
• Giải pháp: Thay đổi mức cô lập mặc định Session 1 lên mức cô lập cao hơn là Serializable trước khi bắt đầu Session 1 Vì ở mức cô lập này giao dịch chỉ làm việc với dữ liệu tại thời điểm bắt đầu giao dịch và không thấy những thay đổi được thực hiện bởi giao dịch khác
-Bảng mô tả giải pháp cho tình huống Phantom Read:
Session 1 thiết lập mức cô lập là Serializable
DECLARE v_ORDER SYS_REFCURSOR; o_ID NUMBER(19,0); o_ADDRESS VARCHAR2(100); o_DATE DATE; o_STATUS VARCHAR2(50); o_TOTAL NUMBER(11,2); c_ID NUMBER(19,0);
Session 1 thực hiện thao tác truy vấn thông tin các đơn hàng của khách hàng có tên
PL/SQL procedure successfully completed
FIND_ORDER('Ly Tran Anh Qui', v_ORDER);
DBMS_OUTPUT.PUT_LINE('~Thong tin~');
FETCH v_ORDER INTO o_ID, o_ADDRESS, o_DATE, o_STATUS, o_TOTAL, c_ID;
DBMS_OUTPUT.PUT_LINE('ORDER_ID:
' || o_ID || CHR(10) || 'ADDRESS: ' || o_ADDRESS || CHR(10) || 'DATE: ' || o_DATE || CHR(10) ||'STATUS: ' || o_STATUS || CHR(10) ||'TOTAL: ' || o_TOTAL || CHR(10) || 'CUS_ID: ' || c_ID||
PL/SQL procedure successfully completed
PL/SQL procedure successfully completed
Session 2 thực hiện việc hủy đơn hàng có ID là 2
Session 2 thực hiện xong và kết thúc
DECLARE v_ORDER SYS_REFCURSOR; o_ID NUMBER(19,0); o_ADDRESS VARCHAR2(100); o_DATE DATE; o_STATUS VARCHAR2(50); o_TOTAL NUMBER(11,2); c_ID NUMBER(19,0);
FIND_ORDER('Ly Tran Anh Qui', v_ORDER);
DBMS_OUTPUT.PUT_LINE('~~Thong tin~~');
FETCH v_ORDER INTO o_ID, o_ADDRESS, o_DATE, o_STATUS, o_TOTAL, c_ID;
DBMS_OUTPUT.PUT_LINE('ORDER_ID:
' || o_ID || CHR(10) || 'ADDRESS: ' || o_ADDRESS || CHR(10) || 'DATE: ' || o_DATE || CHR(10) ||'STATUS: ' || o_STATUS || CHR(10) ||'TOTAL: ' || o_TOTAL || CHR(10) || 'CUS_ID: ' || c_ID||
PL/SQL procedure successfully completed
Session 1 thực hiện thao tác truy vấn thông tin các đơn hàng của khách hàng có tên
Mô tả tình huống: Nhân viên A đang xem thông tin đơn đặt hàng X thì có một nhân viên khác tiến hành cập nhật trạng thái của đơn đặt hàng này Khi nhân viên A xuất báo cáo thì thấy dữ liệu đã bị thay đổi
Bảng mô tả tình huống Non-repeatable read:
Session 1 thiết lập mức cô lập là Read Committed
DECLARE v_ORDER SYS_REFCURSOR; o_ID NUMBER(19,0); o_ADDRESS VARCHAR2(100); o_DATE DATE; o_STATUS VARCHAR2(50); o_TOTAL NUMBER(11,2); c_ID NUMBER(19,0);
DBMS_OUTPUT.PUT_LINE('~~Thong tin~~')
FETCH v_ORDER INTO o_ID, o_ADDRESS, o_DATE, o_STATUS, o_TOTAL, c_ID;
DBMS_OUTPUT.PUT_LINE('ORDER_ID
: ' || o_ID || CHR(10) || 'ADDRESS: ' || o_ADDRESS || CHR(10) || 'DATE: ' || o_DATE || CHR(10) ||'STATUS: ' || o_STATUS || CHR(10) ||'TOTAL: ' || o_TOTAL || CHR(10) || 'CUS_ID: ' || c_ID||
Session 1 thực hiện thao tác truy vấn thông tin đơn hàng có ID là
PL/SQL procedure successfully completed
PL/SQL procedure successfully completed
Session 2 thực hiện cập nhật trạng thái đơn hàng có ID là 1
Session 2 thực hiện xong và kết thúc
DECLARE v_ORDER SYS_REFCURSOR; o_ID NUMBER(19,0); o_ADDRESS VARCHAR2(100); o_DATE DATE; o_STATUS VARCHAR2(50); o_TOTAL NUMBER(11,2); c_ID NUMBER(19,0);
DBMS_OUTPUT.PUT_LINE('~~Thong tin~~');
FETCH v_ORDER INTO o_ID, o_ADDRESS, o_DATE, o_STATUS, o_TOTAL, c_ID;
DBMS_OUTPUT.PUT_LINE('ORDER_ID
: ' || o_ID || CHR(10) || 'ADDRESS: ' || o_ADDRESS || CHR(10) || 'DATE: ' ||
Session 1 thực hiện thao tác truy vấn thông tin các đơn hàng có
ID là 1 thì thấy thông tin đã thay đổi o_DATE || CHR(10) ||'STATUS: ' || o_STATUS || CHR(10) ||'TOTAL: ' || o_TOTAL || CHR(10) || 'CUS_ID: ' || c_ID||
PL/SQL procedure successfully completed
• Nguyên nhân: Session 1 đang có mức cô lập mặc định là Read Committed nên mỗi lần đọc trên một đơn vị dữ liệu thì nó sẽ đọc từ cơ sở dữ liệu lên Lần đọc sau thì cơ sở dữ liệu đã bị thay đổi dẫn đến việc đọc ra kết quả khác với lần đọc đầu tiên mặc dù điều kiện đọc vẫn giống nhau
• Giải pháp: Tương tự trường hợp Phantom Read, thay đổi mức cô lập mặc định của session 1 lên mức cô lập cao hơn là Serializable trước khi bắt đầu session 1
Bảng mô tả giải pháp cho tình huống Non-repeatable read:
Session 1 thiết lập mức cô lập là Serializable
DECLARE v_ORDER SYS_REFCURSOR; o_ID NUMBER(19,0); o_ADDRESS VARCHAR2(100); o_DATE DATE; o_STATUS VARCHAR2(50); o_TOTAL NUMBER(11,2); c_ID NUMBER(19,0);
Session 1 thực hiện thao tác truy vấn thông tin đơn hàng có
DBMS_OUTPUT.PUT_LINE('~~Thong tin~~');
FETCH v_ORDER INTO o_ID, o_ADDRESS, o_DATE, o_STATUS, o_TOTAL, c_ID;
DBMS_OUTPUT.PUT_LINE('ORDER_I
D: ' || o_ID || CHR(10) || 'ADDRESS: ' || o_ADDRESS || CHR(10) || 'DATE: ' || o_DATE || CHR(10) ||'STATUS: ' || o_STATUS || CHR(10) ||'TOTAL: ' || o_TOTAL || CHR(10) || 'CUS_ID: ' || c_ID|| CHR(10) || '~~~~~~~~~');
PL/SQL procedure successfully completed
PL/SQL procedure successfully completed
Session 2 thực hiện cập nhật trạng thái đơn hàng có ID là 1
Session 2 thực hiện xong và kết thúc
DECLARE v_ORDER SYS_REFCURSOR; o_ID NUMBER(19,0); o_ADDRESS VARCHAR2(100);
Session 1 thực hiện thao tác truy vấn thông o_DATE DATE; o_STATUS VARCHAR2(50); o_TOTAL NUMBER(11,2); c_ID NUMBER(19,0);
DBMS_OUTPUT.PUT_LINE('~~Thong tin~~');
FETCH v_ORDER INTO o_ID, o_ADDRESS, o_DATE, o_STATUS, o_TOTAL, c_ID;
DBMS_OUTPUT.PUT_LINE('ORDER_I
D: ' || o_ID || CHR(10) || 'ADDRESS: ' || o_ADDRESS || CHR(10) || 'DATE: ' || o_DATE || CHR(10) ||'STATUS: ' || o_STATUS || CHR(10) ||'TOTAL: ' || o_TOTAL || CHR(10) || 'CUS_ID: ' || c_ID|| CHR(10) || '~~~~~~~~~');
PL/SQL procedure successfully completed tin các đơn hàng có ID là 1
Mô tả tình huống: Tại một thời điểm, session 1 tiến hành truy vấn sản phẩm X và cập nhật số lượng sản phẩm X từ 14 lên 20 sản phẩm Ngay sau đó, session 2 cũng tiến hành truy vấn sản phẩm X và cập nhật số lượng sản phẩm X từ 14 lên 30 Tuy nhiên session 2 xác nhận trước khi session 1 xác nhận
Bảng mô tả tình huống Lost Update:
Session 1 thực hiện truy vấn hiển thị thông tin sản phẩm có ID là 7
Session 1 cập nhật số lượng sản phẩm có
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Session 2 tiến hành thiết lập mức cô lập Read Committed
UPDATE PRODUCT SET QUANTITY = 30 WHERE PRODUCT_ID = 7;
Session 2 thực hiện việc cập nhật số lượng sản phẩm có
Session 1 đang giữ khóa của đơn vị dữ liệu này nên session 2 đợi session 1 xác nhận
Session 1 xác nhận và kết thúc
Session 2 thực hiện cập nhật thành công
Session 2 xác nhận và kết thúc
SELECT PRODUCT_NAME, QUANTITY from PRODUCT where PRODUCT_ID = 7;
Session 2 thực hiện truy vấn sản phẩm có
ID là 7, thấy thông tin đúng như đã cập nhật
Session 1 thực hiện truy vấn sản phẩm có
ID là 7, thấy thông tin khác so với giá trị đã cập nhật
• Nguyên nhân: Khi Session 1 truy xuất lại đến thông tin số lượng sản phẩm X thì Session 2 đã cập nhật thành công và đã được xác nhận sau khi session 1 xác nhận nên số lượng sản phẩm X cuối cùng là số lượng mà Session 2 cập nhật
• Giải pháp: Thay đổi mức cô lập mặc định của session 2 lên mức cô lập cao hơn là Serializable trước khi bắt đầu session 2 Vì ở mức cô lập này, thì session phải đảm bảo được tính nhất quán dữ liệu Vậy nên khi seesion 1 commit trong lúc session 2 đang thực hiện thì lúc này oracle sẽ thông báo cho session 2 lỗi không thể thiết lập mức cô lập này
-Bảng mô tả giải pháp cho tình huống Lost Update:
Session 1 thực hiện truy vấn hiển thị thông tin sản phẩm có ID là 7
Session 1 cập nhật số lượng sản phẩm có
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Session 2 tiến hành thiết lập mức cô lập serializable
UPDATE PRODUCT SET QUANTITY = 30 WHERE PRODUCT_ID = 7;
Session 2 thực hiện việc cập nhật số lượng sản phẩm có
ID là 7 Session 1 đang giữ khóa của
- của đơn vị dữ liệu này nên session 2 đợi session 1 xác nhận
Session 1 xác nhận và kết thúc
Error report - ORA-08177: can't serialize access for this transaction
Session 2 xác nhận và kết thúc
SELECT PRODUCT_NAME, QUANTITY from PRODUCT where PRODUCT_ID = 7;
Session 2 thực hiện truy vấn sản phẩm có
Session 1 thực hiện truy vấn sản phẩm có
ID là 7, thấy thông tin đúng so với giá trị đã cập nhật
Mô tả tình huống: Khi khách hàng A đang thực hiện việc mua hàng nhưng chưa xác nhận Cùng lúc đó, nhân viên B thực hiện việc xem doanh số của khách hàng A Sau đó, giao dịch mua hàng của khách hàng A bị rollback vì thanh toán không thành công Vì vậy nhân viên B đã đọc sai thông tin của khách hàng A
Tuy nhiên, Oracle sẽ áp dụng "Statement-level read consistency" (độ nhất quán đọc cấu trúc truy vấn) nghĩa là trong quá trình thực thi truy vấn, Oracle sẽ đảm bảo rằng chỉ xem dữ liệu đã được xác nhận trước khi câu truy vấn bắt đầu Bất kỳ thay đổi nào do các giao dịch khác thực hiện trong quá trình này sẽ không ảnh hưởng đến kết quả của câu truy vấn Nó giúp đảm bảo các truy vấn sẽ không nhìn thấy dữ liệu chưa xác nhận hoặc dữ liệu đang được thay đổi bởi các giao dịch khác Vậy nên không thể xảy ra trường hợp Dirty Read trong Oracle.
Deadlock
• Deadlock là tình trạng hai hay nhiều giao tác đang tranh chấp tài nguyên và phải chờ các giao tác còn lại hoàn tất, kết quả là không một giao tác nào thực hiện được.
• Oracle sẽ kiểm tra deadlock định kỳ Nếu có deadlock, một trong những giao tác sẽ bị từ bỏ để giao tác kia tiếp tục Oracle có thể áp dụng các thuật toán và chiến lược khác nhau để đảm bảo tính nhất quán và hiệu suất trong quản lý tài nguyên và xung đột
• Phương pháp ngăn ngừa Deadlock: Trước khi hệ thống chấp nhận một yêu cầu từ
1 giao tác lên đơn vị dữ liệu, hệ thống sẽ kiểm tra xem đơn vị dữ liệu này có đang bị tranh chấp không đồng thời dự báo xem nếu chấp nhận yêu cầu này có thể đưa hệ thống vào tình trạng Deadlock không.Nếu có thì hệ thống tạm ngưng hoặc hủy bỏ yêu cầu
4.4.2 Mô tả Deadlock trong đồ án môn học
Tại thời điểm t0: Nhân viên A cập nhật số lượng sản phẩm X
Tại thời điểm t1: Nhân viên B cập nhật số lượng sản phẩm Y
Tại thời điểm t2: Nhân viên A cập nhật số lượng sản phẩm Y
Tại thời điểm t3: Nhân viên B cập nhật số lượng sản phẩm X
Bảng mô tả tình huống Deadlock:
Session 1 (Nhân viên A) Session 2 (Nhân viên B) Giải thích t0 UPDATE PRODUCT SET
Session 1 cập nhật số lượng sản phẩm có ID là 8 t1 UPDATE PRODUCT SET
QUANTITY = 60 WHERE PRODUCT_ID = 9 -1 row updated
Session 1 cập nhật số lượng sản phẩm có ID là 9 t2 UPDATE PRODUCT SET
Session 1 cập nhật số lượng sản phẩm có ID là 8 nhưng session 2
- đang giữa khóa trên bản ghi này t3 UPDATE PRODUCT SET
Session 1 cập nhật số lượng sản phẩm có ID là 9 nhưng session 1 đang giữa khóa trên bản ghi này t4
ORA-00060: deadlock detected while waiting for resource
Oracle thông báo phát hiện deadlock
• Nguyên nhân: Session 1 đang giữ khóa trên đơn vị dữ liệu có PRODUCT_ID là 8, đợi Session 2 nhả khóa trên đơn vị dữ liệu có PRODUCT_ID là 9 Session 2 đang giữ khóa trên đơn vị dữ liệu có PRODUCT_ID là 9 và đợi Session 1 nhả khóa trên đơn vị dữ liệu có PRODUCT_ID là 8 Đây gọi là xảy ra Cycle deadlock khi mà session này chờ session còn lại trả khóa ghi, các session chờ lẫn nhau
• Giải pháp: Hệ quản trị cơ sở dữ liệu Oracle sẽ tự động rollback giao dịch gây ra deadlock là session 1.
PHÂN QUYỀN TRUY CẬP
Tổng quan về Spring Security
Spring security là một framework được sử dụng trong java thường đi kèm theo trong các dự án Spring, có chức năng bảo mật web, xác thực người dùng, phân quyền và bảo vệ các tài nguyên được sử dụng trong dự án đó.
Phân quyền người dùng quản lý và nhân viên
Bước 1: Tạo một file ‘GreenMartDetails’ để lấy những thông tin cơ bản trong Entity
Login_Employee và @Overide những phương thức cần thiết
Hình 5.1: Mô tả phân quyền 1
Bước 2: Tạo một file ‘GreenMartDetailsService’ để cung cấp những phương thức để lấy được thông tin đăng nhập mà user cung cấp từ URL /login
Hình 5.2: Mô tả phân quyền 2
Bước 3: Cấu hình file ‘WebSecurityConfig’ để có thể thiết lập xác thực cho từng user vào trang web tương ứng (ở đây nhân viên và quản lý cùng sử dụng chung 1 source và phân quyền truy cập cho từng URL)
Hình 5.3: Mô tả phân quyền 3
Bước 4: Để hiển thị phân quyền cho từng chức vụ khác nhau thì sec:authorize cho thanh navigator
Hình 5.5: Mô tả phân quyền 5
Phân quyền người dùng khách hàng
Tương tự người dùng nhân viên, khách hàng có các file như CustomerDetails và
CustomerDetailsService Và cấu hình file WebConfigSecurity như sau:
Hình 5.6: Mô tả phân quyền 6
THIẾT KẾ GIAO DIỆN
Đăng nhập
Hình 6.1: Màn hình đăng nhập
Bảng mô tả màn hình đăng nhập:
1 div Hiển thị giao diện người dùng
2 input Hiển thị tên tài khoản do người dùng nhập
3 input Hiển thị password do người dùng nhập
4 input Thực hiện ẩn/hiện mật khẩu
5 input Thực hiện thao tác ghi nhớ tài khoản
6 input Thực hiện thao tác đăng nhập
Đăng ký
Hình 6.2: Màn hình đăng ký
Bảng mô tả màn hình đăng ký:
STT Tên thẻ html Chức năng
1 p Hiển thị giao diện người dùng
2 p Hiển thị giao diện người dùng
3 input Hiển thị tên do người dùng nhập
4 input Hiển thị số điện thoại do người dùng nhập
5 input Hiển thị ngày sinh
6 input Hiển thị mail do người dùng nhập
7 input Hiển thị password do người dùng nhập
8 input Hiển thị địa chỉ do người dùng nhập
9 input Thực hiện thao tác đăng kí
Thông tin cá nhân khách hàng
Hình 6.3: Màn hình thông tin cá nhân khách hàng
Bảng mô tả màn hình thông tin cá nhân khách hàng:
STT Tên thẻ html Chức năng
1 p Hiển thị giao diện người dùng
2 p Hiển thị giao diện người dùng
3 Input Hiển thị tên do người dùng nhập
4 Input Hiển thị số điện thoại do người dùng nhập
5 Input Hiển thị ngày sinh
6 Input Hiển thị gmail do người dùng nhập
7 Input Hiển thị địa chỉ do người dùng nhập
8 a Thực hiện thao tác đổi mật khẩu
9 Input Thực hiện thao tác cập nhật
Thay đổi mật khẩu
Hình 6.4: Màn hình thay đổi mật khẩu
Bảng mô tả màn hình thay đổi mật khẩu:
STT Tên thẻ html Chức năng
1 div Hiển thị giao diện người dùng
2 Input Hiển thị password hiện tại do người dùng nhập
3 Input Hiển thị password mới do người dùng nhập
4 Input Hiển thị xác thực mật khẩu mới do người dùng nhập
5 Input Thực hiện thao tác đổi mật khẩu
Trang chủ
Hình 6.5: Màn hình trang chủ
Bảng mô tả màn hình trang chủ:
STT Tên thẻ html Chức năng
1 a Thực hiện việc chuyển đến trang chủ
2 a Thực hiện việc chuyển đến trang về chúng tôi
3 a Hiển thị giao diện người dùng
4 a Thực hiện việc chuyển đến trang các loại thịt
5 a Thực hiện việc chuyển đến trang các loại hải sản
6 a Thực hiện việc chuyển đến trang các sản phẩm từ sữa và trứng
7 a Thực hiện việc chuyển đến trang các loại trái cây
8 a Thực hiện việc chuyển đến trang các loại rau
9 div Mở thanh tìm kiếm
10 a Thực hiện việc chuyển đến trang giỏ hàng
11 div Mở cửa sổ các tính năng
12 p Hiển thị giao diện người dùng
13 img Hiển thị giao diện người dùng
14 h2 Hiển thị giao diện người dùng
15 div Hiển thị giao diện người dùng
16 p Hiển thị giao diện người dùng
17 p Hiển thị giao diện người dùng
18 div Hiển thị giao diện người dùng
19 p Hiển thị giao diện người dùng
20 div Thực hiện thêm sản phẩm vào giỏ hàng
21 a Thực hiện chuyển tiếp đến trang hồ sơ người dùng
22 a Thực hiện chuyến tiếp đến trang đơn hàng của tôi
23 a Thực hiện chuyển tiếp đến trang lịch sử đơn hàng
24 a Thực hiện thao tác đăng xuất
25 p Thực hiện thao tác đóng cửa sổ tính năng
Trang giới thiệu cửa hàng
Hình 6.6: Màn hình giới thiệu cửa hàng
Bảng mô tả màn hình giới thiệu cửa hàng:
STT Tên thẻ html Chức năng
1 div Hiển thị giao diện người dùng
2 p Hiển thị giao diện người dùng
3 img Hiển thị giao diện người dùng
4 p Hiển thị giao diện người dùng
Hiển thị các sản phẩm cửa hàng
Hình 6.7: Màn hình hiển thị các sản phẩm
Bảng mô tả màn hình hiển thị các sản phẩm:
STT Tên thẻ html Chức năng
1 h2 Hiển thị giao diện người dùng
2 Input Hiển thị tên sản phẩm do người dùng nhập để tìm kiếm
3 div Thực hiện thao tác đóng cửa sổ tìm kiếm
4 img Hiển thị giao diện người dùng
5 div Hiển thị giao diện người dùng
6 h2 Hiển thị giao diện người dùng
Hiển thị chi tiết sản phẩm
Hình 6.8: Màn hình hiển thị chi tiết sản phẩm
Bảng mô tả màn hình hiển thị chi tiết sản phẩm:
STT Tên thẻ html Chức năng
1 p Hiển thị giao diện người dùng
2 div Hiển thị giao diện người dùng
3 div Hiển thị giao diện người dùng
4 img Hiển thị giao diện người dùng
5 strong Hiển thị giao diện người dùng
6 strong Hiển thị giao diện người dùng
7 Input Thực hiện thao tác thêm sản phẩm vào giỏ hàng
Giỏ hàng
Hình 6.9: Màn hình giỏ hàng
Bảng mô tả màn hình giỏ hàng:
STT Tên thẻ html Chức năng
1 p Hiển thị giao diện người dùng
2 th Hiển thị giao diện người dùng
3 th Hiển thị giao diện người dùng
4 th Hiển thị giao diện người dùng
5 a Thực hiện thao tác cập nhật số lượng sản phẩm
6 a Thực hiện thao tác cập nhật số lượng sản phẩm
7 div Hiển thị số lượng sản phẩm hiện có
8 a Thực hiện thao tác xóa sản phẩm
9 a Thực hiện thao tác đặt hàng
Đặt hàng
Hình 6.10: Màn hình đặt hàng
Bảng mô tả màn hình đặt hàng:
STT Tên thẻ html Chức năng
1 h2 Hiển thị giao diện người dùng
2 div Hiển thị giao diện người dùng
3 div Hiển thị giao diện người dùng
4 span Hiển thị giao diện người dùng
5 Input Hiển thị số điện thoại do người dùng nhập
6 select Hiển thị thành phố
9 Input Hiển thị địa chỉ do người dùng nhập
10 Input Thực hiện thao tác thanh toán bằng tiền mặt
11 Input Thực hiện thao tác thanh toán onl
12 div Hiển thị giao diện người dùng
13 Input Thực hiện thao tác quay lại trang trước
14 Input Thực hiện thao tác đặt hàng
Thanh toán
Giao diện này của cổng thanh toán VNPAY
Hình 6.11a: Màn hình cổng thanh toán VNPAY
Hình 6.11b: Màn hình cổng thanh toán VNPAY
Bảng mô tả màn hình cổng thanh toán VNPay:
1 Hiển thị giao diện người dùng
2 Hiển thị giao diện người dùng
3 Hiển thị giao diện người dùng
4 Hiển thị giao diện người dùng
5 Thực hiện thao tác cập nhật số lượng sản phẩm
6 Thực hiện thao tác cập nhật số lượng sản phẩm
7 Hiển thị số lượng sản phẩm hiện có
8 Thực hiện thao tác xóa sản phẩm
Xem đơn hàng
Hình 6.12: Màn hình xem thông tin đơn hàng
Bảng mô tả màn hình xem thông tin đơn hàng:
STT Tên thẻ html Chức năng
1 div Hiển thị giao diện người dùng
2 div Hiển thị giao diện người dùng
3 div Hiển thị giao diện người dùng
4 div Hiển thị giao diện người dùng
5 div Hiển thị giao diện người dùng
6 div Hiển thị giao diện người dùng
7 div Hiển thị giao diện người dùng
8 div Hiển thị giao diện người dùng
9 a Thực hiện thao tác feedback sản phẩm
10 a Thực hiện thao tác mua lại
Phản hồi sản phẩm
Hình 6.13: Màn hình phản hồi sản phẩm
Bảng mô tả màn hình phản hồi sản phẩm:
STT Tên thẻ html Chức năng
1 h2 Hiển thị giao diện người dùng
2 div Hiển thị giao diện người dùng
3 điv Hiển thị giao diện người dùng
4 textarea Hiển thị thông tin feedback do người dùng nhập
5 Input Thực hiện thao tác thêm phản hồi
Thông tin cá nhân nhân viên
Hình 6.14: Màn hình thông tin cá nhân nhân viên
Bảng mô tả màn hình thông tin cá nhân nhân viên:
STT Tên thẻ html Chức năng
1 p Hiển thị giao diện người dùng
2 p Hiển thị giao diện người dùng
3 Input Hiển thị tên do người dùng nhập
4 Input Hiển thị số điện thoại do người dùng nhập
5 Input Hiển thị ngày sinh
6 Input Hiển thị gmail do người dùng nhập
7 Input Hiển thị địa chỉ do người dùng nhập
8 a Thực hiện thao tác đổi mật khẩu
9 Input Thực hiện thao tác cập nhật
10 Input Hiển thị ngày vào làm
11 Input Hiển thị lương cứng của nhân viên
Quản lý sản phẩm
Hình 6.15: Màn hình quản lý sản phẩm
Bảng mô tả màn hình quản lý sản phẩm:
STT Tên thẻ html Chức năng
1 img Hiển thị giao diện người dùng
2 h2 Hiển thị giao diện người dùng
3 p Hiển thị giao diện người dùng
4 p Hiển thị giao diện người dùng
5 Span Hiển thị giao diện người dùng
6 input Hiển thị số số lượng sản phẩm muốn cập nhật do nhân viên nhập
Quản lý khách hàng
Hình 6.16: Màn hình quản lý khách hàng
Bảng mô tả màn hình quản lý khách hàng:
STT Tên thẻ html Chức năng
1 p Hiển thị giao diện người dùng
2 th Hiển thị giao diện người dùng
3 th Hiển thị giao diện người dùng
4 th Hiển thị giao diện người dùng
5 th Hiển thị giao diện người dùng
6 th Hiển thị giao diện người dùng
7 th Hiển thị giao diện người dùng
8 th Hiển thị giao diện người dùng
9 Input Hiển thị thông tin khách hàng cần tra cứu do người dùng nhập
10 Button Thực hiện thao tác tra cứu khách hàng
11 button Thực hiện thao tác xóa bộ lọc
Quản lý đơn hàng
Hình 6.17: Màn hình quản lý đơn hàng
Bảng mô tả màn hình quản lý đơn hàng:
STT Tên thẻ html Chức năng
1 p Hiển thị giao diện người dùng
2 th Hiển thị giao diện người dùng
3 th Hiển thị giao diện người dùng
4 th Hiển thị giao diện người dùng
5 th Hiển thị giao diện người dùng
6 th Hiển thị giao diện người dùng
7 th Hiển thị giao diện người dùng
8 th Hiển thị giao diện người dùng
9 input Hiển thị thông tin khách hàng cần tra cứu do người dùng nhập
10 button Thực hiện thao tác tra cứu khách hàng
11 button Thực hiện thao tác xóa bộ lọc
12 a Thực hiện thao tác xuất hóa đơn
13 button Thực hiện thao tác xem chi tiết hóa đơn
Quản lý nhân viên
Hình 6.18: Màn hình quản lý nhân viên
Bảng mô tả màn hình quản lý nhân viên:
STT Tên thẻ html Chức năng
1 p Hiển thị giao diện người dùng
2 th Hiển thị giao diện người dùng
3 th Hiển thị giao diện người dùng
4 th Hiển thị giao diện người dùng
5 th Hiển thị giao diện người dùng
6 th Hiển thị giao diện người dùng
7 th Hiển thị giao diện người dùng
8 th Hiển thị giao diện người dùng
9 th Hiển thị giao diện người dùng
10 Input Hiển thị thông tin khách hàng cần tra cứu do người dùng nhập
11 Button Thực hiện thao tác tra cứu khách hàng
12 Button Thực hiện thao tác xóa bộ lọc
13 button Thực hiện chuyển trang đến trang thêm nhân viên
14 input Thực hiện thao tác xóa nhân viên
Quản lý doanh thu
Hình 6.19: Màn hình quản lý doanh thu
Bảng mô tả màn hình quản lý doanh thu:
STT Tên thẻ html Chức năng
1 p Hiển thị giao diện người dùng
2 select Hiển thị tháng muốn xe doanh thu do quản lý chọn
3 select Hiển thị năm muốn xem doanh thu do quản lý chọn
4 p Hiển thị doanh thu trong thời gian quản lý chọn
Quản lý phản hồi
Hình 6.20: Màn hình quản lý phản hồi
Bảng mô tả màn hình quản lý phản hồi:
STT Tên thẻ html Chức năng
1 p Hiển thị giao diện người dùng
2 th Hiển thị giao diện người dùng
3 th Hiển thị giao diện người dùng
4 th Hiển thị giao diện người dùng
5 th Hiển thị giao diện người dùng
6 Th Hiển thị giao diện người dùng
7 input Hiển thị thông tin khách hàng cần tra cứu do người dùng nhập
8 button Thực hiện thao tác tra cứu khách hàng
9 button Thực hiện thao tác xóa bộ lọc
Thêm nhân viên
Hình 6.21: Màn hình thêm nhân viên
Bảng mô tả màn hình thêm nhân viên:
STT Tên thẻ html Chức năng
1 p Hiển thị giao diện người dùng
2 p Hiển thị giao diện người dùng
3 input Hiển thị tên do người dùng nhập
4 input Hiển thị số điện thoại do người dùng nhập
5 input Hiển thị ngày sinh
6 input Hiển thị ngày vào làm
7 input Hiển thị lương cứng của nhân viên
8 input Hiển thị gmail do người dùng nhập
9 input Hiển thị địa chỉ do người dùng nhập
10 input Thực hiện thao tác thêm nhân viên