Rumah > Soal Jawab > teks badan
经常听人说在交易系统中,生成订单的时候要控制好两个:一个是幂等性的控制,一个是并发性的控制。
我的理解是这样的,并发性的控制,可以从数据库层面上,利用锁表中行的操作,分布式锁的方式来实现并发性,那么幂等性呢?查了一些资料对于幂等性这个概念的理解,还是越看越模糊,有没有什么通俗的对于幂等性的解释呢?此外怎么在生成订单的系统中做好幂等性的控制呢?
所以我的问题是:
1、怎么通俗的理解幂等性 ?
2、如何在项目中做到幂等性的控制,防止订单碎片的产生??
谢谢~~
ringa_lee2017-04-18 09:27:43
Terima kasih~ Sebenarnya pemahaman anda salah~ Saya tidak tahu di mana anda melihat maklumat ini...
Sebenarnya... menyelesaikan masalah konkurensi... bukan sekadar kunci pangkalan data yang mudah... ia adalah perlu Ia direalisasikan melalui satu siri caching, lencongan, penapisan, dan lain-lain. apabila pengguna membuat pesanan secara liar, hanya satu yang akan berkuat kuasa dalam amalan... Penyelesaiannya sangat mudah ~ terbahagi kepada dua lapisan... titik kawalan bahagian hadapan tidak boleh diklik lagi... bahagian belakang secara unik mengenal pasti permintaan ~ dan kemudian menyimpannya dalam cache ~ hanya satu yang akan benar-benar berkuat kuasa selepas itu ~
.
PHP中文网2017-04-18 09:27:43
Idempotence ialah janji (bukan pelaksanaan) yang dibuat oleh antara muka sistem kepada dunia luar Ia menjanjikan bahawa selagi antara muka berjaya dipanggil, berbilang panggilan luaran akan mempunyai kesan yang sama pada sistem sebagai idempotent akan menganggap kegagalan panggilan luaran sebagai Normal, dan pasti akan ada percubaan semula selepas kegagalan.
Untuk mencegah pemecahan pesanan yang anda nyatakan, apa yang saya tahu ialah ia bergantung pada urus niaga saya tidak tahu apa yang mereka gunakan dalam persekitaran konkurensi tinggi seperti Alipay.
ringa_lee2017-04-18 09:27:43
Menggunakan token bukan sahaja boleh menghalang CSRF, tetapi juga menghalang main semula di peringkat UI.
PHP中文网2017-04-18 09:27:43
Contoh mudah untuk memahami mati pucuk
public class Main {
private int i = 0;
//这个方法不具有幂等性,每调用一次,它就会改变Main的状态(即改变了i)
public void idempotent() {
i++;
}
//幂等性,无论这个方法调用多少次,它都不会改变Main类的状态。
public void simple() {
System.out.println(i);
}
}
Saya faham bahawa pesanan cetakan memerlukan idempotensi, iaitu keadaan di mana data tidak boleh dicetak semasa mencetak pesanan Tidak kira berapa kali pesanan yang sama dicetak, ia tidak akan menjejaskan cetakan pesanan lain. Ini mudah dikawal. Jangan ubah suai data dalam pangkalan data semasa mencetak pesanan Ambil data ke bahagian aplikasi dan prosesnya, supaya ia tidak menyebabkan pemecahan pada bahagian pangkalan data.
PHP中文网2017-04-18 09:27:43
Kesaksamaan merujuk kepada panggilan ke sistem perniagaan Jika berbilang panggilan berlaku, tidak akan ada kesan ke atas sistem perniagaan.
Keperluan ini sangat penting dalam sistem teragih, kerana dalam sistem teragih, pangkalan data itu sendiri tidak dapat melengkapkan kawalan transaksi Beberapa baris gilir mesej dan panggilan tak segerak akan digunakan untuk membuat panggilan jauh apabila menghadapi beberapa situasi tidak normal. ia akan cuba menghubungi perkhidmatan jauh sekali lagi Jika perkhidmatan itu tidak mempunyai jaminan kesaksamaan, mekanisme cuba semula tidak boleh digunakan.
Senario membuat pesanan adalah tidak saksama Jika ia dipanggil beberapa kali, beberapa pesanan akan muncul. Pendekatan biasa adalah untuk membuat pertanyaan berdasarkan maklumat yang diluluskan sebelum membuat pesanan Jika ia telah dilaksanakan, teruskan kembali maklumat panggilan yang berjaya untuk mengelakkan pesanan pendua.
PHP中文网2017-04-18 09:27:43
Mati pucuk boleh difahami sebagai permintaan GET dalam HTTP (jangan katakan bahawa kadangkala kandungannya berbeza apabila anda melawat URL yang sama), dan permintaan POST adalah bukan idempoten. Jadi kebanyakan masa, menggunakan GET adalah bagus! Jangan fikir POST selamat kerana ia menyembunyikan data badan.
迷茫2017-04-18 09:27:43
Mati pucuk menyelesaikan masalah yang jika sebab rangkaian seperti tamat masa berlaku dalam sistem yang diedarkan, pelanggan tidak tahu sama ada pelayan telah melaksanakan dengan jayanya atau gagal. Pada masa ini, pelanggan perlu mencuba semula. Jika antara muka tidak idempoten. Akan menghasilkan hasil yang dijangkakan berbeza.
Ringkasnya, jika antara muka adalah idempoten, kesannya akan sama jika anda memanggilnya sekali atau beberapa kali. Contohnya
KEMASKINI SET jadual NAME="LILEI" WHERE UID='1'