Mengapa sesetengah sambungan mysql memilih data lama pangkalan data mysql selepas padam+masukkan?
P粉882357979
P粉882357979 2023-10-30 12:37:20
0
2
813

Saya menghadapi masalah dengan sesi dalam aplikasi web python/wsgi saya. Setiap thread dalam 2 daemon wsgi mempunyai sambungan mysqldb yang berbeza dan berterusan. Kadangkala, selepas memadamkan sesi lama dan mencipta yang baharu, sesetengah sambungan masih mendapat sesi lama dalam pemilihan, bermakna mereka gagal mengesahkan sesi dan meminta untuk log masuk semula.

Butiran: Sesi disimpan dalam jadual InnoDB dalam pangkalan data mysql tempatan. Selepas mengesahkan (melalui CAS), saya memadamkan mana-mana sesi sebelumnya untuk pengguna itu, mencipta sesi baharu (memasukkan baris), melakukan transaksi dan mengubah hala ke halaman asal yang diminta menggunakan ID sesi baharu daripada kuki. Untuk setiap permintaan, ID sesi dalam kuki disemak terhadap sesi dalam pangkalan data.

Kadangkala, sesi yang baru dibuat tidak ditemui dalam pangkalan data selepas ubah hala. Sebaliknya, sesi lama pengguna masih wujud. (Saya menyemak ini dengan memilih dan mengelog semua sesi pada permulaan setiap permintaan). Entah bagaimana saya mendapat hasil cache. Saya cuba menggunakan SQL_NO_CACHE untuk memilih sesi tetapi ia tidak membuat perbezaan.

Mengapa saya mendapat hasil cache? Di manakah caching boleh berlaku dan bagaimana saya boleh menghentikannya atau membuang cache? Pada asasnya, mengapa sambungan lain tidak dapat melihat data yang baru dimasukkan?

P粉882357979
P粉882357979

membalas semua(2)
P粉696891871

Ya, nampaknya anda hanya akan melakukan satu transaksi dan kemudian memutuskan sambungan. Jika anda mempunyai keperluan yang berbeza, maka anda perlu menangani andaian ini. Seperti yang disebutkan oleh @a_horse_with_no_name, anda boleh melakukan (walaupun saya akan menggunakan rollback jika anda sebenarnya tidak menukar data). Atau anda boleh menukar tahap pengasingan pada kursor - daripada perbincangan iniSaya menggunakan ini:

dbcursor.execute("设置会话事务隔离级别读取已提交")

Sebagai alternatif, nampaknya anda boleh menetapkan autokomit kepada benar pada sambungan:

dbconn.autocommit(True)

Walau bagaimanapun, ini tidak disyorkan jika anda benar-benar membuat perubahan pada sambungan.

P粉545956597

Tahap pengasingan lalai MySQL "BACA BACA", yang bermaksud anda tidak akan melihat sebarang perubahan yang dibuat selepas transaksi dimulakan - walaupun perubahan ini (lain) telah dilakukan.

Jika anda mengeluarkan COMMIT atau ROLLBACK dalam sesi ini, anda sepatutnya melihat data yang diubah (kerana ini akan menamatkan transaksi "berterusan").

Pilihan lain ialah menukar tahap pengasingan sesi ini kepada "MEMBACA KOMITED". Mungkin terdapat juga pilihan untuk menukar tahap lalai, tetapi anda perlu menyemak manual.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan