Saya melakukan beberapa pekerjaan dengan PostgreSQL 9.3 menggunakan psycopg2
API database.
Saya memiliki DB API yang diatur dalam level isolasi minimum (mode "autocommit"), dan saya mengelola transaksi saya sendiri secara langsung melalui SQL. Contoh:
cur = self.conn.cursor()
cur.execute("BEGIN;")
cur.execute("SELECT dbId, downloadPath, fileName, tags FROM {tableName} WHERE dlState=%s".format(tableName=self.tableName), (2, ))
ret = cur.fetchall()
cur.execute("COMMIT;")
Pada dasarnya, apakah transaksi yang dimulai oleh cur.execute("BEGIN;")
terbatas hanya pada kursor itu, atau apakah untuk seluruh koneksi ( self.conn.cursor()
)?
Beberapa hal yang lebih kompleks yang saya lakukan melibatkan beberapa operasi basis data yang terpisah, yang secara logis saya uraikan menjadi beberapa fungsi. Karena ini semua ada di kelas yang memiliki koneksi sebagai anggota, itu jauh lebih nyaman untuk membuat kursor dalam setiap fungsi. Namun, saya tidak yakin bagaimana cara membuat kursor dalam suatu transaksi bekerja.
Pada dasarnya, jika transaksi adalah per-koneksi, saya hanya bisa membuat banyak kursor on-the-fly dalam transaksi. Jika mereka per kursor, itu berarti saya harus melewati kursor di mana-mana. Yang mana itu?
Dokumentasi tidak menyentuh ini, meskipun fakta bahwa Anda dapat menelepon connection.commit()
membuat saya cukup yakin kontrol transaksi adalah per-koneksi.
sumber
begin
. Jika tidak ada transaksi terbuka, yang baru dimulai untuk Anda. Anda hanyacommit
menggambarkan transaksi. Jadi ya, model DB-API tidak mendukung transaksi eksplisit.BEGIN
pernyataan otomatis itu . Saya tidak inginpsycopg2
membuat transaksi baru untuk masing-masingSELECT
.BEGIN
tidak berbahaya dan hanya akan diabaikan oleh PostgreSQLWARNING: there is already a transaction in progress
.Dari dokumentasi psycopg2 :
Pada saat yang sama, dari versi 2.4.2, ada
autocommit
atribut (penekanan ditambahkan):sumber