Báo cáo thực hành cơ sở dữ liệu phân tán
Hệ sở liệu phân tán NHÓM Báo cáo thực hành Cơ sở liệu phân tán Giảng viên hướng dẫn: Nguyễn Tiến Long A PHÂN TÍCH VẤN ĐỀ B Vấn đề • Ở hệ thống ngân hàng có chi nhánh A, B C tọa lạc nơi khác Máy chủ chi nhánh ngân hàng lưu thông tin khách hàng giao dịch khách hàng chi nhánh Ngoài ra, chi nhánh lưu thông tin chi nhánh hệ thống ngân hàng • Ta cần phép phân mảnh ngang xây dựng procedure xử lý hệ quản trị liệu Oracle, để thực giao dịch: gửi tiền vào tài khoản, rút tiền từ tài khoản chuyển tiền vào tài khoản hệ thống ngân hàng • Ta thực thông qua câu truy vấn phân tán, đồng thời tối ưu hóa truy vấn để giao dịch xảy an toàn kết truy xuất nhanh C Bố trí liệu Chi nhánh B TỔ CHỨC DỮ LIỆU Qui định liệu chi nhánh • Tại chi nhánh A: Mã khách hàng bắt đầu A, ví dụ: A001 • Tại chi nhánh B: Mã khách hàng bắt đầu B, ví dụ: B001 nhánh C • Tại chi nhánh C: MãChi khách hàng C001 nhánh B bắt đầu C, ví dụ:Chi Xử lý giao dịch • Giao dịch gửi tiền: Phía khách hàng thực gửi tiền từ chi nhánh hệ thống ngân hàng • Giao dịch rút tiên: Phía khách hàng thực rút tiền từ chi nhánh hệ thống ngân hàng • Giao dịch chuyển tiền: Phía khách hàng thực chuyển tiền từ chi nhánh hệ thống ngân hàng Tổ chức liệu chi nhánh 3.1 Tổ chức liệu máy chủ Chi Nhánh A Tạo user gán quyền quyền cho phép tạo database link cho user Create user chinhanh_A identified by chinhanh_A; create user chinhanh_A identified by chinhanh_A; grant connect, resource to chinhanh_A; grant create database link to chinhanh_A; connect chinhanh_A / chinhanh_A; Tạo bảng create table KHACHHANG( MAKH varchar2(10) primary key, TENKH varchar2(50), TONGTIEN number ); create table CHINHANH( MACN varchar2(5) primary key, TENCN varchar2(50) ); create table GIAODICH( MACN varchar2(5), MAKH varchar2(10), SOTIENGD number, LOAIGD char(1) ); Tạo Constraint ALTER TABLE GIAODICH ADD CONSTRAINT FK_GD_KH FOREIGN KEY (MAKH)REFERENCES KHACHHANG(MAKH); ALTER TABLE GIAODICH ADD CONSTRAINT FK_GD_CN FOREIGN KEY (MACN) REFERENCES CHINHANH(MACN); Insert liệu insert into KHACHHANG values('CN01001','Nguyen Van A',10000000); insert into KHACHHANG values('CN01002','Nguyen Van B',15000000); insert into CHINHANH values('CN01','Vietcombank'); insert into CHINHANH values('CN02','VBQ1'); insert into CHINHANH values('CN03','VBQ3'); Tạo Trigger để cập nhật lại số tiền khách hàng thực giao dịch CREATE OR REPLACE TRIGGER capnhatgd AFTER INSERT ON GIAODICH FOR EACH ROW BEGIN IF :NEW.LOAIGD = 'G' THEN UPDATE KHACHHANG SET KHACHHANG.TONGTIEN=KHACHHANG.TONGTIEN + :NEW.SOTIENGD WHERE KHACHHANG.MAKH=:NEW.MAKH; ELSE UPDATE KHACHHANG SET KHACHHANG.TONGTIEN=KHACHHANG.TONGTIEN :NEW.SOTIENGD WHERE KHACHHANG.MAKH=:NEW.MAKH; END IF; END; 3.2 Tổ chức liệu máy chủ Chi Nhánh B Tạo user gán quyền quyền cho phép tạo database link cho user Create user chinhanh_B identified by chinhanh_B; create user chinhanh_B identified by chinhanh_B; grant connect, resource to chinhanh_B; grant create database link to chinhanh_B; connect chinhanh_B/ chinhanh_B; Tạo bảng create table KHACHHANG( MAKH varchar2(10) primary key, TENKH varchar2(50), TONGTIEN number ); create table CHINHANH( MACN varchar2(5) primary key, TENCN varchar2(50) ); create table GIAODICH( MACN varchar2(5), MAKH varchar2(10), SOTIENGD number, LOAIGD char(1) ); Tạo Constraint ALTER TABLE GIAODICH ADD CONSTRAINT FK_GD_KH FOREIGN KEY (MAKH) REFERENCES KHACHHANG(MAKH); ALTER TABLE GIAODICH ADD CONSTRAINT FK_GD_CN FOREIGN KEY (MACN) REFERENCES CHINHANH(MACN); Insert liệu insert into KHACHHANG values(‘CN02001’,'Nguyen Thi C',10000000); insert into KHACHHANG values(‘CN02001’,'Tran Thi D',15000000); insert into CHINHANH values('CN01','Vietcombank'); insert into CHINHANH values('CN02','VBQ1'); insert into CHINHANH values('CN03','VBQ3'); Tạo Trigger để cập nhật lại số tiền khách hàng thực giao dịch CREATE OR REPLACE TRIGGER capnhatgd AFTER INSERT ON GIAODICH FOR EACH ROW BEGIN IF :NEW.LOAIGD = 'G' THEN UPDATE KHACHHANG SET KHACHHANG.TONGTIEN=KHACHHANG.TONGTIEN + :NEW.SOTIENGD WHERE KHACHHANG.MAKH=:NEW.MAKH; ELSE UPDATE KHACHHANG SET KHACHHANG.TONGTIEN=KHACHHANG.TONGTIEN :NEW.SOTIENGD WHERE KHACHHANG.MAKH=:NEW.MAKH; END IF; END; 3.3 Tổ chức liệu máy chủ Chi Nhánh C Tạo user gán quyền quyền cho phép tạo database link cho user Create user chinhanh_C identified by chinhanh_C; create user chinhanh_C identified by chinhanh_C; grant connect, resource to chinhanh_C; grant create database link to chinhanh_C; connect chinhanh_C/ chinhanh_C; Tạo bảng create table KHACHHANG( MAKH varchar2(10) primary key, TENKH varchar2(50), TONGTIEN number ); create table CHINHANH( MACN varchar2(5) primary key, TENCN varchar2(50) ); create table GIAODICH( MACN varchar2(5), MAKH varchar2(10), SOTIENGD number, LOAIGD char(1) ); Tạo Constraint ALTER TABLE GIAODICH ADD CONSTRAINT FK_GD_KH FOREIGN KEY (MAKH) REFERENCES KHACHHANG(MAKH); ALTER TABLE GIAODICH ADD CONSTRAINT FK_GD_CN FOREIGN KEY (MACN) REFERENCES CHINHANH(MACN); Insert liệu insert into KHACHHANG values(‘CN03001’,'Le Thi E',10000000); insert into KHACHHANG values(‘CN03001’,Phan Van G',15000000); insert into CHINHANH values('CN01','Vietcombank'); insert into CHINHANH values('CN02','VBQ1'); insert into CHINHANH values('CN03','VBQ3'); Tạo Trigger để cập nhật lại số tiền khách hàng thực giao dịch CREATE OR REPLACE TRIGGER capnhatgd AFTER INSERT ON GIAODICH FOR EACH ROW BEGIN IF :NEW.LOAIGD = 'G' THEN UPDATE KHACHHANG SET KHACHHANG.TONGTIEN=KHACHHANG.TONGTIEN + :NEW.SOTIENGD WHERE KHACHHANG.MAKH=:NEW.MAKH; ELSE UPDATE KHACHHANG SET KHACHHANG.TONGTIEN=KHACHHANG.TONGTIEN :NEW.SOTIENGD WHERE KHACHHANG.MAKH=:NEW.MAKH; END IF; END; C TẠO DATABASE LINK Ta cần tạo database link từ A đến B đến C Và để tạo link từ máy B đến máy C, ta phải thực cấu hình máy để chúng nhận Trên máy chủ B (máy chủ C tương tự) Tạo role gán quyền: Thực user sys system: CREATE ROLE ROLE_GD NOT IDENTIFIED; GRANT insert,select ON chinhanh_B.giaodich TO ROLE_GD; GRANT select on chinhanh_B.khachhang to ROLE_GD; Tạo user để chia quyền truy cập giới hạn bảng cấp cho máy cần tạo link đến CREATE USER guest IDENTIFIED BY guest; GRANT CONNECT TO guest; Gán ROLE_GD cho guest: GRANT ROLE_GD to guest; Kiểm tra xem Role tạo hợp lệ: Connect guest / guest: select * from chinhanh_B.khachhang Vào Net Manager->mở Local Mở Listener Trong ô host: ip máy chủ Chi Nhánh B Trên máy chủ A Connect chinhanh_A/ chinhanh_A; Với chi nhánh, ta tạo database link để thực truy vấn phân tán Vào Net Manager->mở Local Cấu hình để tạo liên kết đến Chi Nhánh B: Click dấu + để thêm instance cho phép tạo link đến máy chủ CN02 Net Service Name: chinhanh_A (tự đặt) ->Next Chọn TCP/IP (Internet Protocol)->Next Host Name: ip máy chủ Chi Nhánh B Service Name: orcl(tên service name máy chủ Chi Nhánh B) Nhấn finish để kết thúc Cấu hình để tạo liên kết đến Chi Nhánh C: Click dấu + để thêm instance cho phép tạo link đến máy chủ Chi Nhánh C Net Service Name: loc(tự đặt) ->Next Chọn TCP/IP (Internet Protocol)->Next Host Name: ip máy chủ Chi Nhánh C Service Name: orcl(tên service name máy chủ Chi Nhánh C) Nhấn finish để kết thúc Lưu ý: start lại services để ghi nhận thay đổi cấu hình Tạo database link đến từ chi nhánh Chi Nhánh A đến Chi Nhánh B Chi Nhánh C: CREATE DATABASE LINK DBL_VINH CONNECT TO GUEST IDENTIFIED BY GUEST USING 'vinh' CREATE DATABASE LINK DBL_LOC CONNECT TO GUEST IDENTIFIED BY GUEST USING 'loc' Thực truy vấn kết để test link vừa tạo: Select * from khachhang UNION Select * from chinhanh_B.khachhang@DBL_CHINHANHB UNION Select * from chinhanh_C.khachhang@DBL_CHINHANHC Kết truy vấn: HÌNH D XỬ LÝ GIAO DỊCH GIỮA CÁC CHI NHÁNH Những điều cần ý: Set thời gian wait time ví dụ giây: dbms_lock.sleep(5); Để thực lệnh dbms_lock.sleep(5), ta phải gán quyền cho nó(dùng user sys): GRANT EXECUTE ON KHACHHANG TO PUBLIC; Set mức cô lập SERIALIZABLE để tránh tượng Dirty Read, NonRepeatable Read Phantom:SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; Để gọi proc, ta phải sử dụng câu lệnh: Set serveroutput on; Gửi tiền chi nhánh A: a Ý tưởng: Đầu vào mã khách hàng số tiền gửi Máy chủ chi nhánh A thực phân tích chuỗi MAKH lấy ký tự chuỗi: Nếu MAKH bắt đầu chuỗi “chi nhánh A”, điều chứng tỏ thông tin khách hàng lưu máy chủ chi nhánh A Hệ thống thực kiểm tra khách hàng máy chủ chi nhánh A cộng tiền khách hàng bảng KHACHHANG tồn khách hàng đó, đồng thời chèn dòng liệu vào bảng GIAODICH với LOAIGD “G” Nếu MAKH bắt đầu chuỗi “chi nhánh B”, điều chứng tỏ thông tin khách hàng lưu máy chủ chi nhánh B Hệ thống thực kiểm tra khách hàng máy chủ chi nhánh B cộng tiền khách hàng bảng chinhanh_B.KHACHHANG tồn khách hàng đó, đồng thời chèn dòng liệu vào bảng chinhanh_B.GIAODICH với LOAIGD “G” thông qua DBL_CHINHANHB Nếu MAKH bắt đầu chuỗi “chi nhánh c”, điều chứng tỏ thông tin khách hàng lưu máy chủ chi nhánh B Hệ thống thực kiểm tra khách hàng máy chủ chi nhánh B cộng tiền khách hàng bảng chinhanh_C.KHACHHANG tồn khách hàng đó, đồng thời chèn dòng liệu vào bảng chinhanh_C.GIAODICH với LOAIGD “G” thông qua DBL_CHINHANHC Nếu MAKH không thuộc vào ba trường hợp trên, thông báo cho người sử dụng thông tin mã khách hàng không xác b Procedure gửi tiền chi nhánh CN01: create or replace procedure guitien(v_MAKH in varchar2,v_money in Number) As dem int; Begin SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; if(substr(v_MAKH,0,4) = 'CNA') THEN select count(MAKH) into dem from KHACHHANG where MAKH = v_MAKH; if(dem>0) then insert into GIAODICH values('CNA',v_MAKH,v_money,'G'); DBMS_OUTPUT.PUT_LINE('Gửi tiền thành công!'); else DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng này'); end if; elsif(substr(v_MAKH,0,4) = 'CNB') THEN select count(MAKH) into dem from chinhanh_B.KHACHHANG@DBL_CHINHANHB where MAKH = v_MAKH; if(dem>0) then insert into chinhanh_B.GIAODICH@DBL_CHINHANHB values('CN01',v_MAKH,v_money,'G'); DBMS_OUTPUT.PUT_LINE('Gửi tiền thành công!'); else DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng này'); end if; elsif(substr(v_MAKH,0,4) = 'CNC') THEN select count(MAKH) into dem from chinhanh_C.KHACHHANG@DBL_CHINHANHC where MAKH = v_MAKH; if(dem>0) then insert into chinhanh_C.GIAODICH@DBL_CHINHANHC values('CN01',v_MAKH,v_money,'G'); else else DBMS_OUTPUT.PUT_LINE('Gửi tiền thành công!'); DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng này'); end if; DBMS_OUTPUT.PUT_LINE('Mã khách hàng không đúng'); end if; COMMIT; End; c Kết chạy thử: Gửi tiền vào khách hàng Chi Nhánh A: HÌNH HÌNH Gửi tiền vào khách hàng Chi Nhánh B: HÌNH HÌNH Gửi tiền với mã khách hàng không đúng: HÌNH Gửi tiền với mã khách hàng không tồn tại: HÌNH Rút tiền chi nhánh A: a Ý tưởng: Đầu vào mã khách hàng số tiền rút Máy chủ Chi Nhánh A thực phân tích chuỗi MAKH lấy ký tự chuỗi: Nếu MAKH bắt đầu chuỗi “CNA”, điều chứng tỏ thông tin khách hàng lưu máy chủ Chi Nhánh A Hệ thống thực kiểm tra khách hàng máy chủ Chi Nhánh A kiểm tra số tiền có tài khoản khách hàng Hệ thống thực trừ tiền khách hàng bảng KHACHHANG tồn khách hàng số tiền lại lớn số tiền rút 50000, đồng thời chèn dòng liệu vào bảng GIAODICH với LOAIGD “R” Nếu MAKH bắt đầu chuỗi “CNB”, điều chứng tỏ thông tin khách hàng lưu máy chủ Chi Nhánh B Hệ thống thực kiểm tra khách hàng máy chủ Chi Nhánh B kiểm tra số tiền có tài khoản khách hàng Hệ thống thực hiệntrừ tiền khách hàng bảng 10 vinh_ddbms.KHACHHANG tồn khách hàng số tiền lại lớn số tiền rút 50000, đồng thời chèn dòng liệu vào bảng vinh_ddbms.GIAODICH với LOAIGD “R” thông qua DBL_CHINHANHB Nếu MAKH bắt đầu chuỗi “CNC”, điều chứng tỏ thông tin khách hàng lưu máy chủ Chi Nhánh C Hệ thống thực kiểm tra khách hàng máy chủ Chi Nhánh C kiểm tra số tiền có tài khoản khách hàng Hệ thống thực hiệntrừ tiền khách hàng bảng chinhanh_C.KHACHHANG tồn khách hàng số tiền lại lớn số tiền rút 50000, đồng thời chèn dòng liệu vào bảng loc_ddbms.GIAODICH với LOAIGD “R” thông qua DBL_CHINHANHC Nếu MAKH không thuộc vào ba trường hợp trên, thông báo cho người sử dụng thông tin mã khách hàng không xác b Procedure rút tiền chi nhánh CNA: create or replace procedure ruttien(v_MAKH in varchar2,v_money in Number) As dem int; tongtien int; Begin SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; if(substr(v_MAKH,0,4) = 'CNA') THEN select count(MAKH) into dem from KHACHHANG where MAKH = v_MAKH; if(dem>0) then select tongtien into tongtien from KHACHHANG where MAKH = v_MAKH; if(tongtien-v_money>= 50000) then insert into GIAODICH values('CNA',v_MAKH,v_money,'R'); DBMS_OUTPUT.PUT_LINE('Rút tiền thành công!'); else DBMS_OUTPUT.PUT_LINE('Bạn không đủ tiền rút!'); end if; else DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng này'); end if; elsif(substr(v_MAKH,0,4) = 'CNB') THEN select count(MAKH) into dem from chinhanh_B.KHACHHANG@DBL_CHINHANHB where MAKH = v_MAKH; 11 if(dem>0) then select tongtien into tongtien from KHACHHANG where MAKH = v_MAKH; if(tongtien-v_money>= 50000) then insert into GIAODICH values('CNA',v_MAKH,v_money,'R'); DBMS_OUTPUT.PUT_LINE('Rút tiền thành công!'); else DBMS_OUTPUT.PUT_LINE('Bạn không đủ tiền rút!'); end if; else DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng này'); end if; elsif(substr(v_MAKH,0,4) = 'CN02') THEN select count(MAKH) into dem from chinhanh_B.KHACHHANG@DBL_CHINHANHB where MAKH = v_MAKH; if(dem>0) then select tongtien into tongtien from chinhanh_B.KHACHHANG@DBL_CHINHANHB where MAKH = v_MAKH; if(tongtien-v_money >= 50000) then insert into chinhanh_B.GIAODICH@DBL_CHINHANHB values('CNA',v_MAKH,v_money,'R'); DBMS_OUTPUT.PUT_LINE('Rút tiền thành công!'); else DBMS_OUTPUT.PUT_LINE('Bạn không đủ tiền rút!'); end if; else DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng này'); end if; elsif(substr(v_MAKH,0,4) = 'CN03') THEN select count(MAKH) into dem from loc_ddbms.KHACHHANG@DBL_LOC where MAKH = v_MAKH; if(dem>0) then select tongtien into tongtien from chinhanh_C.KHACHHANG@DBL_CHINHANHC where MAKH = v_MAKH; if(tongtien-v_money >= 50000) then insert into chinhanh_C.GIAODICH@DBL_CHINHANHC values('CNA',v_MAKH,v_money,'G'); 12 DBMS_OUTPUT.PUT_LINE('Rút tiền thành công!'); else DBMS_OUTPUT.PUT_LINE('Bạn không đủ tiền rút!'); end if; else DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng này'); end if; else DBMS_OUTPUT.PUT_LINE('Mã khách hàng không đúng'); end if; COMMIT; End; c Kết chạy thử: Rút từ khách hàng CNA: HÌNH Kết quả: HÌNH Rút từ khách hàng CNB: HÌNH 10 Kết quả: HÌNH 11 Rút số tiền lớn quy định(tiền gốc – tiền rút >= 50000) HÌNH 12 Thực rút (20000000>13000000): HÌNH 13 Chuyển tiền chi nhánh A: a Ý tưởng: Đầu vào mã khách hàng gửi, mã khách hàng nhận số tiền chuyển Máy chủ CNA thực phân tích MAKH_GUI người dùng nhập vào: Nếu MAKH_GUI bắt đầu chuỗi “CNA”, điều chứng tỏ thông tin khách hàng chuyển tiền lưu máy chủ CNA Nó thực kiểm tra tổng tiền có tài khoản khách hàng Sau đó, phân tích chuỗi MAKH_NHAN: 13 Nếu MAKH_NHAN bắt đầu chuỗi “CNA”, hệ thống thực xử lý tập trung CNA cách trừ tiền khách hàng gửi cộng thêm tiền vào tài khoản khách hàng nhận Đồng thời, chèn dòng liệu vào bảng giao dịch Nếu MAKH_NHAN bắt đầu chuỗi “CNB”, hệ thống thực trừ tiền khách hàng gửi máy chủ CNA cộng tiền cho khách hàng nhận máy chủ CNB Đồng thời chèn dòng liệu vào bảng giao dịch hai chi nhánh CNA CNB Nếu MAKH_NHAN bắt đầu chuỗi “CNC”, hệ thống thực trừ tiền khách hàng gửi máy chủ CNA cộng tiền cho khách hàng nhận máy chủ CNC Đồng thời chèn dòng liệu vào bảng giao dịch hai chi nhánh CNA CNC Nếu MAKH_GUI bắt đầu chuỗi “CNB”, điều chứng tỏ thông tin khách hàng chuyển tiền lưu máy chủ CNB Nó thực kiểm tra tổng tiền có tài khoản khách hàng Sau đó, phân tích chuỗi MAKH_NHAN: Nếu MAKH_NHAN bắt đầu chuỗi “CNA”, hệ thống thực trừ tiền khách hàng gửi CNB cộng thêm tiền vào tài khoản khách hàng nhận CNA Đồng thời, chèn dòng liệu vào bảng giao dịch hai chi nhánh CNB CNA Nếu MAKH_NHAN bắt đầu chuỗi “CNB”, hệ thống thực xử lý tập trung trừ tiền khách hàng gửi cộng tiền cho khách hàng nhận Đồng thời chèn dòng liệu vào bảng giao dịch Nếu MAKH_NHAN bắt đầu chuỗi “CNC”, hệ thống thực trừ tiền khách hàng gửi máy chủ CNB cộng tiền cho khách hàng nhận máy chủ CNC Đồng thời chèn dòng liệu vào bảng giao dịch hai chi nhánh CNB CNC Nếu MAKH_GUI bắt đầu chuỗi “CNC”, điều chứng tỏ thông tin khách hàng chuyển tiền lưu máy chủ CNC Nó thực kiểm tra tổng tiền có tài khoản khách hàng Sau đó, phân tích chuỗi MAKH_NHAN: 14 Nếu MAKH_NHAN bắt đầu chuỗi “CNA”, hệ thống thực trừ tiền khách hàng gửi CNCvà cộng thêm tiền vào tài khoản khách hàng nhận CNA Đồng thời, chèn dòng liệu vào bảng giao dịch hai chi nhánh CNC CNA Nếu MAKH_NHAN bắt đầu chuỗi “CNB”, hệ thống thực trừ tiền khách hàng gửi máy chủ CN03 cộng tiền cho khách hàng nhận máy chủ CNB Đồng thời chèn dòng liệu vào bảng giao dịch hai chi nhánh CNC CNB Nếu MAKH_NHAN bắt đầu chuỗi “CNC”, hệ thống thực xử lý tập trung trừ tiền khách hàng gửi cộng tiền cho khách hàng nhận Đồng thời chèn dòng liệu vào bảng giao dịch b Procedure chuyển tiền chi nhánh CN01: create or replace procedure chuyentien(v_MAKH_GUI in varchar2,v_MAKH_NHAN in varchar2, v_money in Number) As dem_gui int; dem_nhan int; tongtien int; Begin SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; if(substr(v_MAKH_GUI,0,4) = 'CN01') THEN select count(MAKH) into dem_gui from KHACHHANG where MAKH = v_MAKH_GUI; if(dem_gui>0) then select tongtien into tongtien from KHACHHANG where MAKH = v_MAKH_GUI; if((tongtien-v_money)>= 50000) then if(substr(v_MAKH_NHAN,0,4) = 'CN01') THEN select count(MAKH) into dem_nhan from KHACHHANG where MAKH = v_MAKH_NHAN; if(dem_nhan>0) then insert into GIAODICH values('CN01',v_MAKH_GUI,v_money,' R'); insert into GIAODICH values ('CN01',v_MAKH_NHAN,v_money,'G'); DBMS_OUTPUT.PUT_LINE('Chuyển tiền thành công!'); else DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng nhận'); end if; 15 elsif(substr(v_MAKH_NHAN,0,4) = 'CN02') THEN select count(MAKH) into dem_nhan from vinh_ddbms.KHACHHANG@DBL_VINH where MAKH = v_MAKH_NHAN; if(dem_nhan>0) then insert into GIAODICH values('CN01',v_MAKH_GUI,v_money,' R'); insert into vinh_ddbms.GIAODICH@DBL_VINH values('CN01',v_MAKH_NHAN,v_money, 'G'); DBMS_OUTPUT.PUT_LINE('Chuyển tiền thành công!'); else DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng nhận'); end if; elsif(substr(v_MAKH_NHAN,0,4) = 'CN03') THEN select count(MAKH) into dem_nhan from loc_ddbms.KHACHHANG@DBL_LOC where MAKH = v_MAKH_NHAN; if(dem_nhan>0) then insert into vinh_ddbms.GIAODICH@DBL_VINH values('CN01',v_MAKH_GUI,v_money,' R'); insert into GIAODICH values ('CN01',v_MAKH_NHAN,v_money,'G'); DBMS_OUTPUT.PUT_LINE('Chuyển tiền thành công'); else DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng nhận'); end if; elsif(substr(v_MAKH_NHAN,0,4) = 'CN02') THEN select count(MAKH) into dem_nhan from vinh_ddbms.KHACHHANG@DBL_VINH where MAKH = v_MAKH_NHAN; if(dem_nhan>0) then 16 insert into vinh_ddbms.GIAODICH@DBL_VINH values('CN01',v_MAKH_GUI,v_money,' R'); insert into vinh_ddbms.GIAODICH@DBL_VINH values('CN01',v_MAKH_NHAN,v_money, 'G'); DBMS_OUTPUT.PUT_LINE('Chuyển tiền thành công'); else DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng nhận'); end if; elsif(substr(v_MAKH_NHAN,0,4) = 'CN03') THEN select count(MAKH) into dem_nhan from loc_ddbms.KHACHHANG@DBL_LOC where MAKH = v_MAKH_NHAN; if(dem_nhan>0) then insert into vinh_ddbms.GIAODICH@DBL_VINH values('CN01',v_MAKH_GUI,v_money,' R'); insert into loc_ddbms.GIAODICH@DBL_LOC values('CN01',v_MAKH_NHAN,v_money, 'G'); DBMS_OUTPUT.PUT_LINE('Chuyển tiền thành công'); else DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng nhận'); end if; else DBMS_OUTPUT.PUT_LINE('Mã khách hàng nhận không đúng'); end if; else DBMS_OUTPUT.PUT_LINE('Bạn không đủ tiền chuyển'); end if; else 17 DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng này'); end if; elsif(substr(v_MAKH_GUI,0,4) = 'CN03') THEN select count(MAKH) into dem_gui from loc_ddbms.KHACHHANG@DBL_LOC where MAKH = v_MAKH_GUI; if(dem_gui>0) then select tongtien into tongtien from loc_ddbms.KHACHHANG@DBL_LOC where MAKH = v_MAKH_GUI; if(tongtien-v_money>= 50000) then if(substr(v_MAKH_NHAN,0,4) = 'CN01') THEN select count(MAKH) into dem_nhan from KHACHHANG where MAKH = v_MAKH_NHAN; if(dem_nhan>0) then insert into loc_ddbms.GIAODICH@DBL_LOC values('CN01',v_MAKH_GUI,v_money,'R'); insert into GIAODICH values ('CN01',v_MAKH_NHAN,v_money,'G'); DBMS_OUTPUT.PUT_LINE('Chuyển tiền thành công'); else DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng nhận'); end if; elsif(substr(v_MAKH_NHAN,0,4) = 'CN02') THEN select count(MAKH) into dem_nhan from vinh_ddbms.KHACHHANG@DBL_VINH where MAKH = v_MAKH_NHAN; if(dem_nhan>0) then insert into loc_ddbms.GIAODICH@DBL_LOC values('CN01',v_MAKH_GUI,v_money,'R'); insert into vinh_ddbms.GIAODICH@DBL_VINH values('CN01',v_MAKH_NHAN,v_money,'G'); DBMS_OUTPUT.PUT_LINE('Chuyển tiền thành công'); else DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng nhận'); end if; elsif(substr(v_MAKH_NHAN,0,4) = 'CN03') THEN select count(MAKH) into dem_nhan from loc_ddbms.KHACHHANG@DBL_LOC where MAKH = v_MAKH_NHAN; 18 if(dem_nhan>0) then insert into loc_ddbms.GIAODICH@DBL_LOC values('CN01',v_MAKH_GUI,v_money,'R'); insert into loc_ddbms.GIAODICH@DBL_LOC values('CN01',v_MAKH_NHAN,v_money,'G'); DBMS_OUTPUT.PUT_LINE('Chuyển tiền thành công'); else DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng nhận'); end if; else DBMS_OUTPUT.PUT_LINE('Mã khách hàng nhận không đúng'); end if; else else DBMS_OUTPUT.PUT_LINE('Bạn không đủ tiền chuyển'); end if; DBMS_OUTPUT.PUT_LINE('Không tồn khách hàng này'); end if; else DBMS_OUTPUT.PUT_LINE('Mã khách hàng gửi không đúng'); end if; COMMIT; End; c Kết chạy thử: Chuyển tiền từ khách hàng CAN đến khách hàng CNB: HÌNH 14 Xem kết giao dịch: HÌNH 15 HÌNH 16 19 [...]... CNB Nó thực hiện kiểm tra tổng tiền có trong tài khoản của khách hàng Sau đó, nó phân tích chuỗi MAKH_NHAN: Nếu MAKH_NHAN bắt đầu bằng chuỗi “CNA”, hệ thống thực hiện trừ tiền của khách hàng gửi trên CNB và cộng thêm tiền vào tài khoản khách hàng nhận trên CNA Đồng thời, chèn một dòng dữ liệu vào bảng giao dịch của hai chi nhánh CNB và CNA Nếu MAKH_NHAN bắt đầu bằng chuỗi “CNB”, hệ thống thực hiện... một dòng dữ liệu vào bảng giao dịch Nếu MAKH_NHAN bắt đầu bằng chuỗi “CNC”, hệ thống thực hiện trừ tiền trên khách hàng gửi ở máy chủ CNB và cộng tiền cho khách hàng nhận trên máy chủ CNC Đồng thời chèn một dòng dữ liệu vào bảng giao dịch của cả hai chi nhánh CNB và CNC Nếu MAKH_GUI bắt đầu bằng chuỗi “CNC”, điều này chứng tỏ thông tin khách hàng chuyển tiền được lưu trên máy chủ CNC Nó thực hiện... tiền có trong tài khoản của khách hàng Sau đó, nó phân tích chuỗi MAKH_NHAN: 13 Nếu MAKH_NHAN bắt đầu bằng chuỗi “CNA”, hệ thống thực hiện xử lý tập trung tại CNA bằng cách trừ tiền của khách hàng gửi và cộng thêm tiền vào tài khoản khách hàng nhận Đồng thời, chèn một dòng dữ liệu vào bảng giao dịch Nếu MAKH_NHAN bắt đầu bằng chuỗi “CNB”, hệ thống thực hiện trừ tiền trên khách hàng gửi ở máy chủ... chủ CNA và cộng tiền cho khách hàng nhận trên máy chủ CNB Đồng thời chèn một dòng dữ liệu vào bảng giao dịch của cả hai chi nhánh CNA và CNB Nếu MAKH_NHAN bắt đầu bằng chuỗi “CNC”, hệ thống thực hiện trừ tiền trên khách hàng gửi ở máy chủ CNA và cộng tiền cho khách hàng nhận trên máy chủ CNC Đồng thời chèn một dòng dữ liệu vào bảng giao dịch của cả hai chi nhánh CNA và CNC Nếu MAKH_GUI bắt đầu bằng... trong tài khoản của khách hàng Sau đó, nó phân tích chuỗi MAKH_NHAN: 14 Nếu MAKH_NHAN bắt đầu bằng chuỗi “CNA”, hệ thống thực hiện trừ tiền của khách hàng gửi trên CNCvà cộng thêm tiền vào tài khoản khách hàng nhận trên CNA Đồng thời, chèn một dòng dữ liệu vào bảng giao dịch của hai chi nhánh CNC và CNA Nếu MAKH_NHAN bắt đầu bằng chuỗi “CNB”, hệ thống thực hiện trừ tiền trên khách hàng gửi ở máy... ở máy chủ CN03 và cộng tiền cho khách hàng nhận trên máy chủ CNB Đồng thời chèn một dòng dữ liệu vào bảng giao dịch của cả hai chi nhánh CNC và CNB Nếu MAKH_NHAN bắt đầu bằng chuỗi “CNC”, hệ thống thực hiện xử lý tập trung trừ tiền trên khách hàng gửi và cộng tiền cho khách hàng nhận Đồng thời chèn một dòng dữ liệu vào bảng giao dịch b Procedure chuyển tiền tại chi nhánh CN01: create or replace procedure... ít nhất là 50000, đồng thời chèn một dòng dữ liệu vào bảng vinh_ddbms.GIAODICH với LOAIGD là “R” thông qua DBL_CHINHANHB Nếu MAKH được bắt đầu bằng chuỗi “CNC”, điều này chứng tỏ thông tin khách hàng được lưu trên máy chủ Chi Nhánh C Hệ thống thực hiện kiểm tra khách hàng trên máy chủ Chi Nhánh C và kiểm tra số tiền có trong tài khoản của khách hàng Hệ thống thực hiệntrừ tiền khách hàng trong bảng... tiền rút >= 50000) HÌNH 12 Thực hiện rút (20000000>13000000): HÌNH 13 3 Chuyển tiền chi nhánh A: a Ý tưởng: Đầu vào là mã khách hàng gửi, mã khách hàng nhận và số tiền được chuyển Máy chủ tại CNA thực hiện phân tích MAKH_GUI người dùng nhập vào: Nếu MAKH_GUI bắt đầu bằng chuỗi “CNA”, điều này chứng tỏ thông tin khách hàng chuyển tiền được lưu ngay trên máy chủ CNA Nó thực hiện kiểm tra tổng tiền... trong bảng chinhanh_C.KHACHHANG nếu tồn tại khách hàng và số tiền còn lại lớn hơn số tiền rút ít nhất là 50000, đồng thời chèn một dòng dữ liệu vào bảng loc_ddbms.GIAODICH với LOAIGD là “R” thông qua DBL_CHINHANHC Nếu MAKH không thuộc vào ba trường hợp trên, thông báo cho người sử dụng rằng thông tin về mã khách hàng không chính xác b Procedure rút tiền tại chi nhánh CNA: create or replace procedure... chinhanh_C.KHACHHANG@DBL_CHINHANHC where MAKH = v_MAKH; if(tongtien-v_money >= 50000) then insert into chinhanh_C.GIAODICH@DBL_CHINHANHC values('CNA',v_MAKH,v_money,'G'); 12 DBMS_OUTPUT.PUT_LINE('Rút tiền thành công!'); else DBMS_OUTPUT.PUT_LINE('Bạn không đủ tiền rút!'); end if; else DBMS_OUTPUT.PUT_LINE('Không tồn tại khách hàng này'); end if; else DBMS_OUTPUT.PUT_LINE('Mã khách hàng không đúng'); end ... thực thông qua câu truy vấn phân tán, đồng thời tối ưu hóa truy vấn để giao dịch xảy an toàn kết truy xuất nhanh C Bố trí liệu Chi nhánh B TỔ CHỨC DỮ LIỆU Qui định liệu chi nhánh • Tại chi nhánh... phép phân mảnh ngang xây dựng procedure xử lý hệ quản trị liệu Oracle, để thực giao dịch: gửi tiền vào tài khoản, rút tiền từ tài khoản chuyển tiền vào tài khoản hệ thống ngân hàng • Ta thực. .. khách hàng thực gửi tiền từ chi nhánh hệ thống ngân hàng • Giao dịch rút tiên: Phía khách hàng thực rút tiền từ chi nhánh hệ thống ngân hàng • Giao dịch chuyển tiền: Phía khách hàng thực chuyển