Thời hạn cho các hành động không lưu giao dịch


7

Nếu bạn chỉ nhìn vào cơ sở dữ liệu thì mọi thứ đều ổn. Bạn có giao dịch và nếu đôi khi xảy ra sự cố, mọi thứ sẽ được khôi phục. Điều đó thật tuyệt - tôi thích điều này.

NHƯNG: Tôi muốn gửi thư. Bây giờ tôi gặp rắc rối vì tôi không thể quay trở lại.

thí dụ:

  1. giao dịch bắt đầu
  2. Thư được gửi
  3. Những thứ khác được thực hiện (bên trong DB)
  4. Một cái gì đó đi sai.
  5. Phục hồi.

Làm thế nào để giải quyết điều này là một câu hỏi khác nhau, không phải điều này.

Câu hỏi này làm thế nào để gọi điều này nói chung. Trong ví dụ này là về việc gửi thư. Nhưng vấn đề tương tự ngay khi bạn sửa đổi một cái gì đó trong các hệ thống nằm ngoài ranh giới giao dịch.

Có một tên cho vấn đề này ?

Gần như cùng một vấn đề phát sinh nếu bạn muốn nhập tệp từ một thư mục. Nếu bạn xóa tệp bên trong giao dịch, thì giao dịch có thể thất bại và tệp đã bị xóa nhưng không bao giờ được nhập. Hoặc bạn xóa tập tin sau khi giao dịch. Sau đó, việc xóa tệp có thể không thành công và tệp được nhập lần thứ hai.

Tôi không muốn phát minh lại một giải pháp cho việc này. Đó là lý do tại sao tôi cần thuật ngữ phù hợp cho vấn đề này. Sau đó, tôi có thể đọc một số bài báo và tìm hiểu "tình trạng của nghệ thuật" trong năm 2018.


Tôi nghĩ thuật ngữ bạn đang tìm kiếm là "tác dụng phụ".
hunterjrj

@hunterjrj Tôi đã thử tìm kiếm "hiệu ứng phụ postgresql" nhưng kết quả tìm kiếm đầu tiên không khớp.
guettli

Câu trả lời:


1

Bạn đang mô tả một giao dịch phân tán . Lưu ý rằng thuật ngữ "giao dịch" có ý nghĩa chung hơn là "giao dịch cơ sở dữ liệu".

Trong giao dịch phân tán, các thành viên khác nhau có thể có các thuộc tính ACID khác nhau (ví dụ: email không cần thiết được đảm bảo sẽ được gửi), các cách tiếp cận khác nhau để đạt được các thuộc tính đó và các tình huống thất bại khác nhau.

Để đảm bảo tính nhất quán của giao dịch phân tán, một thực thể bên ngoài được gọi là điều phối viên giao dịch (hoặc người quản lý) thường được sử dụng để kiểm soát cam kết của từng thành viên (cũng có thể được gọi là người quản lý tài nguyên hoặc tài nguyên). Một phương pháp phổ biến là cam kết hai pha (2PC).

Nếu bạn tìm kiếm "tính nhất quán trong các hệ thống phân tán" trên mạng quốc tế, bạn sẽ tìm thấy rất nhiều tài liệu về chủ đề này.


Cảm ơn bạn đã "nhất quán trong các hệ thống phân tán". Tôi nghĩ thuật ngữ này phù hợp rất tốt.
guettli

6

Từ khóa Oracle PL / SQL AUTONOMOUS_TRANSACTIONsẽ gây ra một thủ tục để tạo một phiên khác, thực hiện giao dịch, cam kết / khôi phục chỉ giao dịch riêng tư đó và trả lại quyền kiểm soát luồng cho phụ huynh.

Oh..tất cả gửi email về dữ liệu không được cam kết.

EDIT: (do chỉnh sửa bài gốc)

Gần như cùng một vấn đề phát sinh nếu bạn muốn nhập tệp từ một thư mục. Nếu bạn xóa tệp bên trong giao dịch, thì giao dịch có thể thất bại và tệp đã bị xóa nhưng không bao giờ được nhập. Hoặc bạn xóa tập tin sau khi giao dịch. Sau đó, việc xóa tệp có thể không thành công và tệp được nhập lần thứ hai.

Loại vấn đề này được gọi là a bug.

Giải pháp là:

  • Xác định mỗi bước là của riêng mình TRANSACTION
    • Bạn sẽ muốn tạo chúng theo cách mà bạn có thể chạy lại (hoặc bỏ qua) các bước khi cần thiết
  • Chạy từng bước theo thứ tự thích hợp.
    • không gửi email trước COMMIT.
    • không xóa một tập tin trước khi tải dữ liệu thành công
  • Bạn sẽ cần theo dõi "bạn đang ở đâu" và nếu bước đó đã qua / thất bại.

Ví dụ EMAIL

Bạn nên có một thủ tục để sendEmailđược gọi sau commit.

Nếu bạn muốn gọi thủ tục trước đó commit, bạn sẽ cần thêm một hàng vào hàng đợi rollbackvới giao dịch chính. Đối với Oracle, đây sẽ là một trong hai Advance Queuinghoặc góiAPEX_MAIL

Bằng cách đặt nó trong một quy trình riêng biệt, bạn có thể sendEmaillần thứ 2 theo yêu cầu [người dùng cuối].

Xử lý tập tin

Bạn có một thuật toán chứa một vài bước trong đó mỗi bước có thể thất bại. Điều này thực sự khác với sendEmailvấn đề của bạn .

Bạn cần ghi lại những gì bạn đang xử lý, bạn đang ở đâu trong thuật toán của mình và nếu bước đó đã thành công hay thất bại.

Để phục hồi từ một lỗi ở bất kỳ bước nào, mỗi bước của quy trình cần được xác định là rời rạc TRANSACTION.

Trong Oracle, tôi sẽ có các thủ tục này (1 thủ tục mỗi TRANSACTION):

create or replace
package file_processing_package
as
  procedure update_file_processing_status(
                                p_id       IN files_to_process.id%TYPE
                              , p_status   IN process_states.id%TYPE);


  function add_a_file_to_be_processed( p_filename IN files_to_process.file_name%TYPE )
                               return files_to_process.id%TYPE;

  procedure load_data_from_file( p_id in files_to_process.id%TYPE );

  procedure process_already_loaded_data( p_id in files_to_process.id%TYPE );

  procedure delete_file_from_os( p_id in files_to_process.id%TYPE );
end;
/

Điều này dựa trên các bảng sau:

CREATE TABLE PROCESS_STATES (
  id   int generate by default on null as identity, -- 12c+
  state_desc  varchar2(25) not null,
  constraint process_states_pk primary key (id),
  constraint process_states_uq1 unique (state_desc)
);

insert into process_states( state_desc ) values ( 'file to be processed' );
insert into process_states( state_desc ) values ( 'file loaded' );
insert into process_states( state_desc ) values ( 'processing' );
insert into process_states( state_desc ) values ( 'processing failed' );
insert into process_states( state_desc ) values ( 'processing succeeded' );
insert into process_states( state_desc ) values ( 'delete failed' );
insert into process_states( state_desc ) values ( 'OK' ); -- delete succeeded
commit;

CREATE TABLE FILES_TO_PROCESS (
  id               int generate by default on null as identity, -- 12c+
  file_name        varchar2(50) not null,
  process_state_id int not null,
  constraint file_to_process_pk  primary key (id),
  constraint file_to_process_uq1 unique (file_name),
  constraint file_to_process_fk1 foreign key (process_state_id)
                            references (process_states.id)
);

Các UNIQUEràng buộc về FILE_NAMEngăn chặn cùng một tệp được xử lý hai lần.


Tên của vấn đề này là "giao dịch tự trị"?
guettli

Tôi nghĩ rằng câu trả lời này không phù hợp với câu hỏi. Cảm ơn bạn rất nhiều, rằng bạn muốn giải quyết các trường hợp sử dụng của câu hỏi, nhưng đây không phải là vấn đề. Tôi đã tìm kiếm một thuật ngữ phù hợp để tìm hiểu thêm về vấn đề chung.
guettli

3

Tôi nghĩ có lẽ thuật ngữ bạn đang tìm kiếm là bẩn :

Một lần đọc bẩn (còn gọi là phụ thuộc không được cam kết) xảy ra khi một giao dịch được phép đọc dữ liệu từ một hàng đã được sửa đổi bởi một giao dịch đang chạy khác và chưa được cam kết. [...]

Trong ví dụ của chúng tôi, Giao dịch 2 thay đổi một hàng, nhưng không cam kết các thay đổi. Giao dịch 1 sau đó đọc dữ liệu không được cam kết. Bây giờ nếu Giao dịch 2 khôi phục các thay đổi của nó (đã được đọc bởi Giao dịch 1) hoặc cập nhật các thay đổi khác nhau cho cơ sở dữ liệu, thì chế độ xem dữ liệu có thể sai trong các bản ghi của Giao dịch 1.


1

Những gì bạn mô tả là mong muốn cho một giao dịch phân tán, chỉ có bạn không có trình quản lý giao dịch phân tán và không có khả năng phục hồi. Đơn giản nhất là sử dụng hàng đợi (bên ngoài) hoặc nhà môi giới máy chủ sql để tách vòng lặp khỏi gửi thực tế. Xem ví dụ: http://python-rq.org/


1

Tôi không có một thuật ngữ cụ thể cho sự kết hợp thực tế của việc gọi một quy trình bên ngoài từ một giao dịch cơ sở dữ liệu, nhưng tôi sẽ phân loại vấn đề này là kết hợp chặt chẽ .

Vấn đề gốc là bạn đã kết hợp chặt chẽ việc gửi email với giao dịch cơ sở dữ liệu.

Một giải pháp cho vấn đề này sẽ là cặp đôi lỏng lẻo .

Về mặt kỹ thuật, bạn có thể giải quyết vấn đề này theo nhiều cách, theo thứ tự thô từ xấu đến đẹp:

  • một cờ trên các hàng trong bảng để cho biết email có được gửi hay không. Một quy trình bên ngoài có thể thăm dò cờ và gửi email.
  • tạo và lưu trữ các email trong một bảng. Những điều này sau đó sẽ cam kết trong cùng một giao dịch. Một quy trình bên ngoài đọc và gửi email cần được gửi. Việc giám sát bảng có thể được thực hiện bằng cách bỏ phiếu hoặc với cấu trúc nghe / thông báo (xem tiếp theo).
  • sử dụng cấu trúc lắng nghe / thông báo (triển khai Postgres). Các giao dịch cơ sở dữ liệu gọi THÔNG BÁO. Một quy trình LISTENing chạy liên tục KHÔNG ĐƯỢC XÁC MINH khi giao dịch được thực hiện, cung cấp sự cô lập mong muốn và khớp nối lỏng lẻo .

0

Cam kết tiềm ẩn

Tôi tin là Thuật ngữ bạn đang tìm kiếm. Đây là những tuyên bố làm / có thể & sẽ không tuân thủTransactions

Oracle

MySQL

Máy chủ Sql

cơ sở dữ liệu-ddls-và-ngầm-cam kết

và thú vị nhất là:

sp_send_dbmail (Giao dịch-SQL)

Khi thực hiện sp_send_dbmail mà không có ngữ cảnh giao dịch, Database Mail sẽ khởi động và thực hiện một giao dịch ngầm. Khi thực hiện sp_send_dbmail từ trong một giao dịch hiện có, Database Mail dựa vào người dùng để cam kết hoặc khôi phục mọi thay đổi. Nó không bắt đầu một giao dịch nội bộ.

Quy trình làm việc chỉ cần được chú ý,

Thay vì

  • Giao dịch bắt đầu
  • Thư được gửi
    • Những thứ khác được thực hiện (bên trong DB)
      • Có gì đó không ổn
  • Phục hồi.

THỬ

  • Gửi thư "Bắt đầu với số liệu thống kê chụp nhanh" (chụp số hàng bắt đầu vào một biến A hoặc tệp)
  • Giao dịch bắt đầu
    • Những thứ khác được thực hiện (bên trong DB)
      • Một cái gì đó đi sai.
  • Phục hồi.
  • Gửi thư "Kết thúc với số liệu thống kê chụp nhanh"

(Chụp hàng kết thúc đếm vào một biến B hoặc tệp)

và nếu Biến A & B khớp với bạn, bạn biết có lỗi.

Thay đổi quy trình công việc và thử sử dụng những gì bạn đã có để lợi thế của bạn, so sánh biến, v.v.


-1

Đây là một vấn đề không được tính đến trong giai đoạn "Kỹ thuật yêu cầu" của dự án. Không nên xem đó là một vấn đề của hệ thống cơ sở dữ liệu, vì cơ sở dữ liệu đang hoạt động như bình thường. Thư được gửi vì nó không phải là một phần của logic nghiệp vụ chính xác.

Nó được gọi là lỗ hổng logic nghiệp vụ hoặc thậm chí có thể là vấn đề logic nghiệp vụ .

Logic kinh doanh

Trong phần mềm máy tính, logic nghiệp vụ hoặc logic miền là một phần của chương trình mã hóa các quy tắc kinh doanh trong thế giới thực để xác định cách dữ liệu có thể được tạo, lưu trữ và thay đổi. Nó tương phản với phần còn lại của phần mềm có thể liên quan đến các chi tiết cấp thấp hơn trong việc quản lý cơ sở dữ liệu hoặc hiển thị giao diện người dùng, cơ sở hạ tầng hệ thống hoặc nói chung là kết nối các phần khác nhau của chương trình.

Tham khảo: Logic kinh doanh (Wikipedia.org)

Lỗi / vấn đề logic kinh doanh

Các ứng dụng web đã trở thành cơ chế cốt lõi cho các quy trình kinh doanh qua Internet. Khi ngày càng có nhiều doanh nghiệp chuyển sang mô hình Internet, nó đã dẫn đến các vấn đề và lỗ hổng bảo mật thông tin khác nhau. SQL Injection, Cross Site Scripting, Thực thi mã từ xa để đặt tên cho một số. Tuy nhiên, ngoài các lỗ hổng thông thường, có nhiều dạng lỗ hổng logic kinh doanh thường được những kẻ tấn công khai thác. Các lỗ hổng này thường xuyên bị bỏ qua trong QA vì quá trình này nhằm kiểm tra xem một đoạn mã được cho là phải làm gì và không phải là những gì nó có thể được thực hiện. Vấn đề khác với lỗi logic nghiệp vụ là máy quét không thể xác định được chúng, IDS không thể phát hiện ra chúng và tường lửa ứng dụng Web không thể bảo vệ chúng.

Do đó, lỗ hổng logic nghiệp vụ là cách sử dụng luồng xử lý hợp pháp của ứng dụng theo cách dẫn đến hậu quả tiêu cực cho tổ chức. Chẳng hạn, tự động hóa các quy trình kinh doanh như đơn đặt hàng của khách hàng, truy vấn ngân hàng, chuyển khoản ngân hàng hoặc đấu giá trực tuyến, yêu cầu các thực thể phải có quyền truy cập vào thông tin cực kỳ nhạy cảm. Việc thực hiện không đúng cách có thể dẫn đến các lỗ hổng logic kinh doanh.

Tham khảo: Lỗ hổng logic nghiệp vụ và một số tình huống phổ biến về lỗ hổng logic nghiệp vụ (Cộng đồng an ninh mạng)

"Logic kinh doanh là hành vi dự định của ứng dụng", Dan Kuykendall, đồng CEO và CTO của NT MỤC TIÊU giải thích. "Đó là chức năng chi phối cốt lõi của những gì ứng dụng làm, ví dụ, người dùng nào được phép xem những gì, người dùng phải trả bao nhiêu cho các mặt hàng khác nhau, v.v. Tấn công logic kinh doanh là những điều bạn có thể làm để khai thác logic và gian lận Ứng dụng rất khó để kiểm tra vì chúng đòi hỏi cả sự hiểu biết về ứng dụng và bảo mật. Trong nhiều trường hợp, các nhóm QA biết logic kinh doanh, nhưng họ không phải là chuyên gia bảo mật và chưa được đào tạo về kỹ thuật tấn công thông minh. "

Tham khảo: Lỗi kinh doanh logic thông thường thỏa hiệp bảo mật ứng dụng (SecurityWeek.com)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.