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

Con trỏ trong Django có chạy bên trong giao dịch đang mở không?

Tôi tin rằng bạn cần một kết nối db riêng để có được một giao dịch đồng thời, riêng biệt. Tôi cũng khá chắc chắn rằng django chỉ quản lý một kết nối cho mỗi cơ sở dữ liệu. Nhưng bạn có thể tạo một cái khác. Có thể có một số lý do chính đáng để không làm điều này. Sự phức tạp xuất hiện trong tâm trí.

Tôi nghĩ một cái gì đó như thế này sẽ hoạt động:

from django.conf import settings
from django.db.utils import ConnectionHandler

def my_view(request):
    """Flirt with complexity by using two connections to db"""
    private_connections = ConnectionHandler(settings.DATABASES)
    db = router.db_for_write(model)
    new_conn = private_connections[db]
    new_conn.enter_transaction_management()
    new_conn.managed(True)
    new_cur = new_conn.cursor()
    new_cur.execute("INSERT INTO ...")
    new_conn.commit()
    new_conn.close()

Lưu ý rằng bạn không thể sử dụng django.db.transaction vì nó hoạt động trên các phiên bản kết nối chung trong django.db.connections , nhưng trong mọi trường hợp, đó chỉ là một lớp bọc mỏng xung quanh các phương pháp quản lý giao dịch trên đối tượng kết nối.

Tôi đoán câu hỏi thực sự là tại sao bạn muốn làm điều này ?! Và câu trả lời của Lakshman Prasad có gì sai? Bạn có thể cam kết / khôi phục bất cứ khi nào bạn muốn, vì vậy không có gì ngăn cản bạn thực hiện các tác vụ khác nhau trong các giao dịch riêng biệt trong một chế độ xem. Thực tế là các giao dịch phải song song và không liên tiếp gợi ý về một số kết nối hợp lý giữa chúng, điều mà tôi nghĩ rằng chúng thực sự nên ở trong cùng một giao dịch.

Mặt khác, nếu bạn chỉ đang cố gắng mô phỏng một số loại xử lý ngoại tuyến, sự thành công hay thất bại của chúng không liên quan đặc biệt đến chế độ xem, hãy xem xét việc thiết lập hàng đợi thông báo và thực hiện các thao tác chèn này riêng biệt quá trình. Cần tây là một gói phổ biến để làm điều đó. Tuy nhiên, nếu thời gian phản hồi không phải là mối quan tâm lớn, tôi vẫn nghĩ rằng các giao dịch liên tiếp là đủ.

Cập nhật:

Nếu bạn muốn bộ đệm ẩn được cơ sở dữ liệu hỗ trợ hoạt động ở chế độ tự động gửi trong khi vẫn chạy logic nghiệp vụ của bạn trong một giao dịch (riêng biệt), có một cách django. Tất cả những gì bạn cần làm là đảm bảo rằng bộ nhớ đệm xảy ra bên ngoài commit_on_success :

  • Nếu bạn chỉ đang sử dụng phần mềm trung gian bộ nhớ đệm, hãy đảm bảo rằng phần mềm này nằm ngoài TransactionMiddleware .

  • Nếu bạn sử dụng trình trang trí chế độ xem bộ nhớ đệm, tôi muốn đoán rằng bạn có thể vô hiệu hóa TransactionMiddleware (hoặc đặt chế độ xem sự cố bên trong autocommit decorator) và sử dụng commit_on_success người trang trí bên trong trình trang trí bộ nhớ đệm. Nó trông thật buồn cười, nhưng tôi không biết tại sao nó không hoạt động:

    @transaction.autocommit
    @cache_page(500)
    @transaction.commit_on_success
    def my_view(request):
        "..."
    
  • Nếu bạn sử dụng bộ nhớ đệm theo mẫu hoặc liên quan đến bộ nhớ đệm thủ công, bạn cũng có thể tắt TransactionMiddleware (hoặc đặt chế độ xem sự cố bên trong autocommit decorator) và sử dụng commit_on_success với tư cách là người quản lý ngữ cảnh để chỉ đặt mã bạn cần trong giao dịch được quản lý, để phần còn lại của chế độ xem ở chế độ tự động gửi.

    @transaction.autocommit
    def my_view(request):
        data = cache.get(some_key)
        with transaction.commit_on_success():
            context = do_some_processing(data)
        cache.set(some_key, context['data'])
        return render('template/with/cache/blocks.html', context=context)
    


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách triển khai một LMS canvas khả dụng cao với Cụm cơ sở dữ liệu PostgreSQL

  2. Chèn nhiều hàng với pg-promise

  3. Các tính năng ẩn của PostgreSQL

  4. Spring Data Pessimistic Lock timeout with Postgres

  5. Lấy N hàng cuối cùng trong cơ sở dữ liệu theo thứ tự?