PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Apakah kursor di Django berjalan di dalam transaksi terbuka?

Saya yakin Anda memerlukan koneksi db terpisah untuk mendapatkan transaksi simultan yang terpisah. Saya juga cukup yakin Django hanya mengelola satu koneksi per database. Tapi Anda bisa membuat yang lain. Mungkin ada alasan bagus untuk tidak melakukan ini. Kompleksitas muncul di benak.

Saya pikir sesuatu seperti ini akan berhasil:

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()

Perhatikan bahwa Anda tidak dapat menggunakan django.db.transaction karena ia beroperasi pada instans koneksi global di django.db.connections , tetapi bagaimanapun, itu hanyalah pembungkus tipis di sekitar metode manajemen transaksi pada objek koneksi.

Saya rasa pertanyaan sebenarnya adalah mengapa Anda ingin melakukan ini?! Dan apa yang salah dengan jawaban Lakshman Prasad? Anda dapat melakukan/mengembalikan kapan pun Anda mau, jadi tidak ada yang mencegah Anda melakukan tugas yang berbeda dalam transaksi yang berbeda dalam satu tampilan. Fakta bahwa transaksi harus paralel dan tidak berurutan mengisyaratkan beberapa hubungan logis di antara mereka, yang menurut saya menunjukkan bahwa mereka harus benar-benar berada dalam transaksi yang sama.

Jika, di sisi lain, Anda hanya mencoba untuk meniru semacam pemrosesan offline, yang keberhasilan atau kegagalannya tidak terlalu relevan dengan tampilan sama sekali, pertimbangkan untuk menyiapkan antrian pesan dan melakukan penyisipan ini secara terpisah proses. Seledri adalah paket populer untuk melakukan hal itu. Namun, jika waktu respons bukan masalah utama, menurut saya transaksi yang berurutan sudah cukup.

Pembaruan:

Jika Anda ingin cache yang didukung basis data Anda beroperasi dalam mode komit otomatis saat masih menjalankan logika bisnis Anda dalam satu transaksi (terpisah), ada cara Django. Yang perlu Anda lakukan adalah memastikan bahwa caching terjadi di luar commit_on_success :

  • Jika Anda hanya menggunakan middleware caching, pastikan itu di luar TransactionMiddleware .

  • Jika Anda menggunakan dekorator tampilan caching, saya berani menebak bahwa Anda dapat menonaktifkan TransactionMiddleware (atau letakkan tampilan masalah di dalam autocommit dekorator) dan gunakan commit_on_success dekorator di dalam dekorator cache. Kelihatannya lucu, tapi saya tidak tahu mengapa itu tidak berhasil:

    @transaction.autocommit
    @cache_page(500)
    @transaction.commit_on_success
    def my_view(request):
        "..."
    
  • Jika Anda menggunakan caching template atau melakukan caching manual yang lebih melibatkan, Anda juga dapat menonaktifkan TransactionMiddleware (atau letakkan tampilan masalah di dalam autocommit dekorator) dan gunakan commit_on_success sebagai pengelola konteks untuk hanya memasukkan kode yang Anda butuhkan dalam transaksi terkelola, meninggalkan sisa tampilan dalam komit otomatis.

    @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. Django mengatur ulang bidang pk/id peningkatan otomatis untuk produksi

  2. Kunci asing + pewarisan tabel di PostgreSQL?

  3. Cara yang lebih baik daripada beberapa pernyataan SELECT?

  4. PostgreSQL - Ganti Entitas HTML

  5. Oracle Cast dan MULTISET tersedia di POSTGRES