Bagaimana untuk melaksanakan transaksi teragih dan pertanyaan silang jadual dalam MySQL?
Pengenalan:
Memandangkan skala aplikasi terus berkembang, keperluan untuk sistem teragih menjadi semakin mendesak. Dalam sistem teragih, pemprosesan transaksi pangkalan data dan pertanyaan silang jadual telah menjadi cabaran teknikal yang penting. Artikel ini akan memperkenalkan cara melaksanakan transaksi teragih dan pertanyaan silang jadual dalam MySQL untuk menampung keperluan sistem teragih.
1. Urus niaga teragih
Transaksi teragih ialah transaksi apabila operasi yang melibatkan berbilang pangkalan data mesti dilakukan atau ditarik balik secara keseluruhan. Transaksi teragih MySQL boleh dilaksanakan dalam dua cara: transaksi teragih berdasarkan protokol XA dan transaksi teragih berdasarkan komitmen dua fasa (2PC).
- Transaksi teragih berdasarkan protokol XA
Protokol XA ialah protokol transaksi global yang disertai oleh pelbagai sistem pengurusan pangkalan data. Ia terdiri daripada dua fasa: fasa penyediaan dan fasa penyerahan. Dalam fasa penyediaan, setiap pangkalan data akan menghantar permintaan penyediaan kepada penyelaras untuk memberitahu penyelaras status penyediaan transaksi. Penyelaras akan menunggu semua pangkalan data bersedia sebelum menghantar permintaan komit kepada semua peserta, memberitahu mereka untuk melakukan transaksi. Jika terdapat masalah dengan mana-mana peserta, penyelaras akan menghantar permintaan tarik balik kepada semua peserta, memberitahu mereka untuk melancarkan transaksi.
Berikut ialah contoh kod untuk melaksanakan transaksi yang diedarkan menggunakan pendekatan ketekalan Transaksi. Ia mengandungi dua fasa: fasa pengundian dan fasa penyerahan. Semasa fasa pengundian, penyelaras menghantar mesej kepada peserta bertanyakan mereka sama ada mereka bersedia untuk melakukan transaksi. Jika semua peserta sudah bersedia, penyelaras menghantar mesej komit kepada semua peserta, meminta mereka melakukan transaksi. Jika mana-mana peserta tidak bersedia atau undian yang diterima oleh penyelaras tidak konsisten, penyelaras menghantar mesej batalkan kepada semua peserta, meminta mereka melancarkan transaksi. Berikut ialah kod sampel yang menggunakan komitmen dua fasa untuk melaksanakan transaksi yang diedarkan:
Connection conn1 = null;
Connection conn2 = null;
try {
// 获取数据库连接1
conn1 = dataSource1.getConnection();
conn1.setAutoCommit(false);
// 获取数据库连接2
conn2 = dataSource2.getConnection();
conn2.setAutoCommit(false);
// 在数据库1上执行操作
// ...
// 在数据库2上执行操作
// ...
// 提交分布式事务
conn1.commit();
conn2.commit();
} catch (SQLException e) {
// 回滚分布式事务
if (conn1 != null) {
conn1.rollback();
}
if (conn2 != null) {
conn2.rollback();
}
} finally {
// 关闭数据库连接
if (conn1 != null) {
conn1.close();
}
if (conn2 != null) {
conn2.close();
}
}
- 2. Pertanyaan silang jadual
Pertanyaan silang jadual merujuk kepada operasi pertanyaan yang melibatkan berbilang jadual pada masa yang sama dalam pernyataan pertanyaan. Dalam MySQL, pertanyaan silang jadual boleh dilaksanakan melalui kaedah berikut: subkueri, pertanyaan gabungan, indeks teks penuh dan jadual terbahagi.
Subquery
Subquery ialah kaedah pertanyaan berdasarkan hasil pertanyaan sebagai syarat pertanyaan lain. Ia boleh bersarang dalam penyata SELECT, penyata FROM, penyataan WHERE dan penyataan lain untuk mendapatkan data yang berkaitan. Berikut ialah contoh kod yang menggunakan subkueri untuk melaksanakan pertanyaan silang jadual:
Connection conn1 = null;
Connection conn2 = null;
try {
// 获取数据库连接1
conn1 = dataSource1.getConnection();
conn1.setAutoCommit(false);
// 获取数据库连接2
conn2 = dataSource2.getConnection();
conn2.setAutoCommit(false);
// 在数据库1上执行操作
// ...
// 在数据库2上执行操作
// ...
// 第一阶段:询问所有参与者是否准备好提交事务
conn1.prepare();
conn2.prepare();
// 第二阶段:提交或回滚事务
if (conn1.isReady() && conn2.isReady()) {
conn1.commit();
conn2.commit();
} else {
conn1.rollback();
conn2.rollback();
}
} catch (SQLException e) {
// 回滚分布式事务
if (conn1 != null) {
conn1.rollback();
}
if (conn2 != null) {
conn2.rollback();
}
} finally {
// 关闭数据库连接
if (conn1 != null) {
conn1.close();
}
if (conn2 != null) {
conn2.close();
}
}
- Join pertanyaan
Join query ialah kaedah pertanyaan yang memadankan dan mengaitkan data dalam dua atau lebih jadual mengikut medan yang berkaitan. Melalui pertanyaan gabungan, berbilang jadual boleh terlibat dalam satu pertanyaan pada masa yang sama, dan data yang berkaitan boleh diperoleh berdasarkan keadaan perkaitan antara medan. Berikut ialah kod sampel yang menggunakan pertanyaan gabungan untuk melaksanakan pertanyaan silang jadual:
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2 WHERE condition);
- Indeks teks penuh
Indeks teks penuh ialah kaedah pengindeksan berdasarkan kandungan teks dan bukannya kata kunci sahaja. Dengan mencipta indeks teks penuh, anda boleh melakukan pemadanan kabur menggunakan kata kunci dalam pertanyaan silang jadual untuk mendapatkan hasil yang berkaitan. Berikut ialah kod sampel yang menggunakan indeks teks penuh untuk melaksanakan pertanyaan silang jadual:
SELECT * FROM table1 JOIN table2 ON table1.column = table2.column WHERE condition;
- Jadual partition
Jadual partition ialah kaedah untuk meningkatkan prestasi pertanyaan dan kebolehselenggaraan dengan membahagikan jadual besar kepada beberapa jadual kecil mengikut tertentu peraturan. Dengan mencipta sekatan dalam jadual sekatan, hanya sekatan yang berkaitan boleh disoal dalam pertanyaan silang jadual, mengurangkan masa pertanyaan. Berikut ialah contoh kod yang menggunakan jadual terbahagi untuk melaksanakan pertanyaan silang jadual:
SELECT * FROM table1 WHERE MATCH(column) AGAINST('keyword');
Kesimpulan: - Dalam sistem teragih, transaksi teragih MySQL dan pertanyaan silang jadual ialah dua cabaran teknikal yang penting. Konsistensi transaksi antara berbilang pangkalan data boleh dijamin dengan menggunakan transaksi teragih berdasarkan protokol XA atau transaksi teragih berdasarkan komitmen dua fasa. Dalam pertanyaan silang jadual, anda boleh menggunakan subkueri, pertanyaan gabungan, indeks teks penuh dan jadual partition untuk melaksanakan operasi pertanyaan berbilang jadual. Melalui pemilihan yang munasabah dan penggunaan cara teknikal, keperluan sistem teragih dapat dipenuhi dengan lebih baik.
Rujukan:
O'Reilly (2014 O'Reilly Media, Inc.
).
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan transaksi teragih dan pertanyaan silang jadual dalam MySQL?. 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