2012-02-16 51 views
5

Chúng tôi đã một cơ sở dữ liệu SQL hiện có, và tôi đang viết một máy chủ Node.js rằng truy cập nó sử dụng SQL thẳng, sử dụng mô-đun này postgres tài xế:Node.js + postgres quản lý cơ sở dữ liệu giao dịch

https://github.com/brianc/node-postgres

Cho đến nay tôi không thể tìm thấy mô-đun nút quản lý giao dịch hoạt động với postgres. Có ai biết không? Tốt hơn với một số sử dụng trong thế giới thực?

Thứ hai, ở mức cao hơn, chúng tôi đang đánh giá liệu node.js thực sự có thể thay thế Java như một giải pháp thực tế cho máy chủ có khả năng xử lý khối lượng hay không. Quản lý giao dịch là một trong những vấn đề chúng tôi phải giải quyết. Vì vậy, một số hiểu biết sâu sắc về điều đó cũng sẽ hữu ích.

Hiện tại, tôi chỉ cần tạo một BEGIN sql khi bắt đầu một yêu cầu máy chủ nút và một ROLLBACK hoặc COMMIT ở cuối. Tuy nhiên, tôi (có lẽ rõ ràng) không quen thuộc với các vấn đề thực tế xung quanh việc quản lý giao dịch SQL. Nếu ai đó có thể giải thích ngắn gọn các vấn đề mà khung quản lý giao dịch giải quyết, tôi sẽ thấy nó hữu ích.

EDIT: Tôi đang sử dụng cơ chế tổng hợp kết nối được tích hợp sẵn của trình điều khiển sau và tất cả các truy vấn trong yêu cầu http được phát hành trên cùng một kết nối thu được từ nhóm. Đầu tiên BEGIN được ban hành, sau đó bất cứ yêu cầu http cụ thể nào, sau đó là COMMIT hoặc ROLLBACK.

Cảm ơn.

Trả lời

3

Quản lý giao dịch là một chủ đề khá lớn. Đối với những gì tôi tưởng tượng bạn đang làm, bạn sẽ muốn sử dụng chế độ AUTOCOMMIT. Điều này về cơ bản có nghĩa là bạn sẽ dựa vào PostgreSQL để BEGIN/COMMIT tất cả các phát biểu của bạn (hoặc nói cách khác, rằng tất cả các câu lệnh của bạn sẽ chạy trong giao dịch của chính họ mà không có mối quan hệ với nhau). Một cách dễ dàng để quyết định chế độ AUTOCOMMIT phù hợp với bạn là quyết định bạn không cần sử dụng ROLLBACK. Một lợi ích to lớn của chế độ AUTOCOMMIT là ngay cả công cụ kết nối kết nối ngu ngốc nhất cũng không thể làm hỏng.

Để biết chi tiết về quản lý giao dịch, hãy bắt đầu bằng cách xem http://www.postgresql.org/docs/9.1/static/transaction-iso.html Bạn đã từng làm gì, đảm bảo bạn không sử dụng hoặc viết một khuôn khổ ngây thơ để lại bạn trong vùng "IDLE in transaction". Và cuối cùng, kể từ khi bạn đề cập đến "khối lượng lớn", tôi nên hỏi những gì số dư của bạn đọc để viết là. Nếu nó có lợi cho hành vi đọc, thì bạn nên cân nhắc viết mã của bạn để sử dụng memcached. Cách dễ nhất (nhưng cách xa hiệu quả nhất) để thực hiện việc này là sử dụng PQC.

+0

Cảm ơn tất cả thông tin. Chúng tôi cần ROLLBACK vì yêu cầu của chúng tôi đưa ra một số câu lệnh cập nhật cần phải là đơn vị nguyên tử. Tôi sẽ xem tài liệu đó và PQC. – Jake

3

pg-promise thư viện sẽ chăm sóc của công tác quản lý giao dịch độc đáo:

db.tx(t => { 
     return t.batch([ 
      t.query('UPDATE users SET active = $1 WHERE id = $2', [true, 123]), 
      t.query('INSERT INTO audit(event, id) VALUES($1, $2)', ['activate', 123]) 
     ]); 
    }) 
    .then(data => { 
     // success; 
    }) 
    .catch(error => { 
     // error; 
    }); 
+0

bạn có biết cách đặt mức giao dịch bằng phương pháp này không? – Derek

+0

@Derek Xem [Giao dịch có thể định cấu hình] (https://github.com/vitaly-t/pg-promise#configurable-transactions) –

+0

Cảm ơn thư viện tuyệt vời vitaly-t !!! – Derek

0

Hãy tìm Sequelize http://docs.sequelizejs.com/en/latest/api/transaction/

Các phân lập mức có thể sử dụng khi bắt đầu một giao dịch:

{ 
    READ_UNCOMMITTED: "READ UNCOMMITTED", 
    READ_COMMITTED: "READ COMMITTED", 
    REPEATABLE_READ: "REPEATABLE READ", 
    SERIALIZABLE: "SERIALIZABLE" 
} 

đèo ở cấp độ mong muốn làm đối số đầu tiên:

return sequelize.transaction({ 
    isolationLevel: Sequelize.Transaction.SERIALIZABLE 
}, function (t) { 

// your transactions 

}).then(function(result) { 
    // transaction has been committed. Do something after the commit if required. 
}).catch(function(err) { 
    // do something with the err. 
}); 
Các vấn đề liên quan