Rumah > Soal Jawab > teks badan
在DB层面实现分布式锁的方法有:利用MySQL的内置函数 get_lock(key, timeout)来实现,这个函数的约定在指定时间内持有锁,它锁的是一行中的某一个字段么?还是锁的是一行?具体项目中是如何使用的?查了一些资料,大概是先约定同一个key,然后先执行get_lock(key,timeout)的,会持有锁,其他的sql只能等待;除非当前的线程释放锁release(key),但是它是如何在项目中控制锁的粒度呢?最好有实例能详解一下。谢谢~~
伊谢尔伦2017-04-18 09:45:21
Kunci ini ialah tahap aplikasi dan digunakan antara sesi mysql yang berbeza. Ia hanyalah kunci nama, dan tidak mempunyai hubungan langsung dengan jadual, baris dan medan yang anda fahami Kunci khusus diserahkan sepenuhnya kepada aplikasi. Ia adalah kunci eksklusif, yang bermaksud mana-mana sesi yang memegang kunci, sesi lain akan gagal apabila cuba mendapatkan kunci.
Sebagai contoh, jika anda ingin mengunci baris rekod A, maka anda membuat kunci dalam sesi semasa get_lock("record A", 10)
. Pada masa ini, semua sesi lain masih boleh mengakses dan mengubah suai rekod A sesuka hati, melainkan mereka turut memanggil get_lock("record A", 10)
secara eksplisit.
Maksudnya, terpulang kepada permohonan anda untuk memutuskan sama ada hendak menyemak kunci atau tidak. Jika anda ingin mengunci, biarkan semua sesi secara eksplisit memanggil get_lock("record A", 10)
apabila mengakses rekod A. Maka jelas sekali hanya satu sesi boleh berjaya. Sesi lain hanya boleh mendapatkan semula kuncirelease_lock
selepas menunggu tamat masa atau memanggil
Begitu juga, jika anda ingin mengunci lajur medan A, kemudian buat kunci get_lock("column A", 10)
seperti di atas. Ringkasnya, terpulang kepada aplikasi untuk memutuskan sama ada untuk mengambil kunci atau tidak, dan pangkalan data hanya menyediakan mekanisme ini. Untuk melihat sama ada semua orang mengambil kunci yang sama, ia adalah semata-mata berdasarkan fakta bahawa parameter pertama, nama kunci, adalah rentetan yang berbeza Oleh itu, amalan terbaik ialah menambah nama jadual dan nama pangkalan data di hadapan nama kunci untuk mengelakkan kerosakan tidak sengaja