Hasil pulangan kenyataan kemas kini dalam mysql: 1. Apabila tiada parameter "useAffectedRows=true" dalam URL pangkalan data, bilangan baris yang sepadan dikembalikan 2. Apabila terdapat "useAffectedRows= true" dalam URL pangkalan data , mengembalikan bilangan baris yang terjejas.
Persekitaran pengendalian tutorial ini: sistem Windows 10, versi mysql8.0.22, komputer Dell G3.
Berapakah bilangan baris yang sepadan hasil daripada pernyataan kemas kini? Atau adakah ia menjejaskan bilangan baris?
Mari kita bincangkan keputusan dahulu: Jika url pangkalan data ialah:
jdbc:mysql://gitlab.fzghjx.com:3306/cron
, maka hasil yang dikembalikan ialah bilangan baris yang dipadankan (Baris dipadankan).
Jika:
jdbc:mysql://gitlab.fzghjx.com:3306/cron?useAffectedRows=true
, maka bilangan baris yang terjejas oleh (Diubah) dikembalikan.
Ringkasnya:
Jika tiada parameter useAffectedRows=true dalam url, bilangan baris yang sepadan akan dikembalikan. Jika ya, bilangan baris yang terjejas dikembalikan.
Bagaimana untuk menjadikan nilai pulangannya sebagai bilangan rekod yang terjejas (berubah)?
Hanya tambah useAffectedRows=true pada parameter url sambungan data mysql
jdbc.url=jdbc:mysql://localhost:3306/ssm?useAffectedRows=true
Pengetahuan lanjutan:
Teka
Jika anda mengendalikan pernyataan kemas kini mysql melalui cmd, paparan skrin sebenarnya seperti ini:
Apabila saya memikirkan masalah ini, Terdapat dua jawapan kepada tindak balas pertama. 2. Pilih nilai ini apabila kembali ke pernyataan pertanyaan.
Disahkan
Meminjam gambar untuk menggambarkan keseluruhan proses mencipta sambungan:
(Gambar diambil dari: https://blog.csdn.net/c929833623lvcha/article/details/44517245)
Setelah saya belajar sebentar, saya dapati kedua-dua ini idea Semua salah. Khususnya:
Saya menulis pertanyaan jdbc mudah:
Mengikut kepada kod sumber dan penjejakan, apabila mysql mewujudkan sambungan, parameter useAffectedRows=true akan ditetapkan sebagai atribut sambungan.
Ikuti dalam
Connection connection = DriverManager.getConnection("jdbc:mysql://gitlab.fzghjx.com:3306/cron?useAffectedRows=true", "root", "root");
:
Teruskan: Kaedah sambung ialah: java.sql.Driver#connect, dilaksanakan Untuk: com.mysql.jdbc.NonRegisteringDriver#connect
useAffectedRows=true dibaca dalam kaedah com.mysql.jdbc.NonRegisteringDriver#parseURL dan ditetapkan kepada Go Properties .
Lebih jauh ke bawah: com.mysql.jdbc.ConnectionImpl#getInstance untuk mendapatkan contoh sambungan
Berikut ialah refleksi, hujahnya ialah JDBC_4_CONNECTION_CTOR Pembina JDBC digunakan:
Pembina JDBC ialah:
public JDBC4Connection(String hostToConnectTo, int portToConnectTo, Properties info, String databaseToConnectTo, String url) throws SQLException { super(hostToConnectTo, portToConnectTo, info, databaseToConnectTo, url); }
Cari, ia adalah pembina ConnectionImp Fungsi:
(Dengan cara ini: tahap pengasingan transaksi ditetapkan kepada 2, bacaan dilakukan)
Dalam pembina ini, mulakan nilai useAffectedRows ke dalam sambungan:
Terdapat 206 sifat yang perlu ditetapkan, useAffectedRows berada di kedudukan ke-190 (versi mysql -connect-java yang berbeza , lokasi berbeza).
Selepas tetapan selesai:
Selepas menetapkan sifat, tiba masanya untuk mencipta MysqlIO: <.>
Terdapat pilihan "ketersediaan tinggi", jika ya, pautan cuba semula IO akan dibuat. Jika tidak, buat pautan IO yang dicuba sekali sahaja, dan tidak akan dicuba semula jika gagal. Pilihan ini juga didayakan dalam URL dengan menetapkan: autoReconnect=true.
Proses sambungan IO sebenarnya untuk mencipta MysqlIO dan kemudian memulakan jabat tangan:
Perkara utama Sekarang: Dalam kaedah doHandshake, pilihan useAffectedRows ditetapkan: (com.mysql.jdbc.MysqlIO#doHandshake)
Nilai CLIENT_FOUND_ROWS ini ialah:
Iaitu, nilai digit kedua terakhir bit rendah melakukan operasi atau . Jika useAffectsRows, tiada operasi atau akan dilakukan.
Selepas menyediakan, hantarkannya ke pelayan mysql melalui soket mysqlOutput:
sumber mysqlOutput: Dicipta apabila MysqlIO dibina.
ok, ini proses yang mudah. Seterusnya, mari lihat mesej tcp:
When useAffectedRows=true:
Hantar permintaan Ke mysql pelayan:
Respons daripada pelayan mysql:
useAffectedRows=false:
Hantar permintaan ke pelayan mysql:
Respons pelayan Mysql:
Seperti yang dapat dilihat daripada mesej di atas, apabilauseAffectedRows adalah benar dan palsu, nilai pulangan pelayan msyql adalah berbeza . Akhir sekali, hasil pulangan yang diperoleh oleh jdbc ialah nilai Baris Terjejas dalam mesej. Diperolehi terus daripada hasil msyql, jdbc hanya melakukan beberapa parsing dan penapisan pada hasil. Ini membuktikan tekaan awal itu salah.
Pembelajaran yang disyorkan:Atas ialah kandungan terperinci Apakah penyataan kemas kini dalam mysql kembali?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!