PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Postgresql:CHUẨN BỊ GIAO DỊCH

Có, nó có thể, nhưng bạn có thực sự cần nó không?

Hãy suy nghĩ kỹ trước khi bạn quyết định đây thực sự phải là hai cơ sở dữ liệu riêng biệt.

Bạn chỉ có thể giữ cả hai kết nối mở và QUAY LẠI lệnh đầu tiên nếu lệnh thứ hai không thành công.

Nếu bạn thực sự cần các giao dịch đã chuẩn bị, hãy tiếp tục đọc.

Về lược đồ của bạn - tôi sẽ sử dụng trình tạo trình tự và mệnh đề RETURNING ở phía cơ sở dữ liệu, chỉ để thuận tiện.

CREATE TABLE tbl_album (
  id    serial PRIMARY KEY,
  name  varchar(128) UNIQUE,
  ...
);
CREATE TABLE tbl_user_album (
  id          serial PRIMARY KEY,
  album_id    bigint NOT NULL,
  ...
);

Bây giờ bạn sẽ cần một số keo bên ngoài - điều phối viên giao dịch phân tán (?) - để làm cho việc này hoạt động bình thường.

Mẹo là sử dụng PREPARE TRANSACTION thay vì COMMIT . Sau đó, sau khi cả hai giao dịch thành công, hãy sử dụng COMMIT PREPARED .

Dưới đây là bằng chứng về khái niệm PHP.

CẢNH BÁO! mã này thiếu quan trọng một phần - đó là kiểm soát lỗi. Bất kỳ lỗi nào trong $db2 nên được bắt và ROLLBACK PREPARED sẽ được thực thi trên $db1 Nếu bạn không bắt được lỗi, bạn sẽ để lại $db1 với các giao dịch bị đóng băng thực sự rất tệ.

<?php
$db1 = pg_connect( "dbname=db1" );
$db2 = pg_connect( "dbname=db2" );
$transid = uniqid();

pg_query( $db1, 'BEGIN' );
$result = pg_query( $db1, "INSERT INTO tbl_album(name) VALUES('Absolutely Free') RETURNING id" );
$row = pg_fetch_row($result);
$albumid = $row[0];
pg_query( $db1, "PREPARE TRANSACTION '$transid'" );
if ( pg_query( $db2, "INSERT INTO tbl_user_album(album_id) VALUES($albumid)" ) ) {
    pg_query( $db1, "COMMIT PREPARED '$transid'" );
}
else {
    pg_query( $db1, "ROLLBACK PREPARED '$transid'" );
}
?>

Và một lần nữa - hãy suy nghĩ trước khi bạn sử dụng nó. Những gì Erwin đề xuất có thể hợp lý hơn.

Ồ và chỉ một lưu ý nữa ... Để sử dụng tính năng PostgreSQL này, bạn cần đặt max_prepared_transactions biến cấu hình thành giá trị khác không.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuỗi kết nối PostgreSQL với trình điều khiển ODBC trong C #, Từ khóa không được hỗ trợ:trình điều khiển

  2. Trình điều khiển QPSQL không được tải Qt

  3. Kích hoạt so với kiểm tra ràng buộc

  4. Cố gắng sửa đổi một ràng buộc trong PostgreSQL

  5. Khung khả dụng cao PostgreSQL tốt nhất là gì? PAF so với repmgr và Patroni Infographic