Rumah  >  Artikel  >  pangkalan data  >  Apakah penyataan kemas kini dalam mysql kembali?

Apakah penyataan kemas kini dalam mysql kembali?

WBOY
WBOYasal
2022-05-19 16:24:027698semak imbas

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.

Apakah penyataan kemas kini dalam mysql kembali?

Persekitaran pengendalian tutorial ini: sistem Windows 10, versi mysql8.0.22, komputer Dell G3.

Apakah kenyataan kemas kini dalam mysql dikembalikan?

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:

1, wujudkan Sambungan

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:

2 Cipta MysqlIO

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.

3. Sambungan jabat tangan dengan pelayan msyql

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:

4, analisis mesej:

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, apabila

useAffectedRows 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:

tutorial video mysql

Atas ialah kandungan terperinci Apakah penyataan kemas kini dalam mysql kembali?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn