java - 怎么理解在生成订单的时候幂等性的控制
天蓬老师
天蓬老师 2017-04-18 09:25:43
0
8
1120

经常听人说在交易系统中,生成订单的时候要控制好两个:一个是幂等性的控制,一个是并发性的控制。
我的理解是这样的,并发性的控制,可以从数据库层面上,利用锁表中行的操作,分布式锁的方式来实现并发性,那么幂等性呢?查了一些资料对于幂等性这个概念的理解,还是越看越模糊,有没有什么通俗的对于幂等性的解释呢?此外怎么在生成订单的系统中做好幂等性的控制呢?
所以我的问题是:
1、怎么通俗的理解幂等性 ?
2、如何在项目中做到幂等性的控制,防止订单碎片的产生??

谢谢~~

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

membalas semua(8)
左手右手慢动作

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 ~

Saya rasa soalan yang anda ajukan beberapa kali ini lebih seperti apa yang dibincangkan dalam buku teks, ia adalah jauh daripada itu Prinsip jualan kilat yang ditulis oleh Taobao Alibaba Cloud baru-baru ini menerbitkan Seni bina sistem sampul merah di bawah konkurensi tinggi dan maklumat praktikal lain yang diringkaskan dalam pengeluaran sebenar~

.

Ty80

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.

左手右手慢动作

Menggunakan token bukan sahaja boleh menghalang CSRF, tetapi juga menghalang main semula di peringkat UI.

Ty80

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.

洪涛

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.

洪涛

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.

迷茫

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'

巴扎黑
UPDATE table SET NAME="LILEI" WHERE UID='1'
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan