Maison  >  Questions et réponses  >  le corps du texte

java - get_lock(str,timeout)函数使用。

在DB层面实现分布式锁的方法有:利用MySQL的内置函数 get_lock(key, timeout)来实现,这个函数的约定在指定时间内持有锁,它锁的是一行中的某一个字段么?还是锁的是一行?具体项目中是如何使用的?查了一些资料,大概是先约定同一个key,然后先执行get_lock(key,timeout)的,会持有锁,其他的sql只能等待;除非当前的线程释放锁release(key),但是它是如何在项目中控制锁的粒度呢?最好有实例能详解一下。谢谢~~

怪我咯怪我咯2715 Il y a quelques jours383

répondre à tous(1)je répondrai

  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:45:21

    Ce verrou est au niveau de l'application et est utilisé entre différentes sessions MySQL. Il s'agit simplement d'un verrou de nom et n'a aucune relation directe avec les tables, lignes et champs que vous comprenez. Le verrou spécifique est entièrement laissé à l'application. Il s'agit d'un verrou exclusif, ce qui signifie que quelle que soit la session détenant le verrou, les autres sessions échoueront lorsqu'elles tenteront d'obtenir le verrou.

    Par exemple, si vous souhaitez verrouiller une ligne de l'enregistrement A, alors vous créez un verrou dans la session en cours get_lock("record A", 10). À ce stade, toutes les autres sessions peuvent toujours accéder et modifier l'enregistrement A à volonté, à moins qu'elles n'appellent également explicitement get_lock("record A", 10).

    C'est-à-dire que c'est entièrement à votre application de décider de vérifier ou non la serrure. Si vous souhaitez verrouiller, laissez toutes les sessions appeler explicitement get_lock("record A", 10) lors de l'accès à l'enregistrement A. Alors évidemment, une seule session peut réussir. Les autres sessions ne peuvent réacquérir le verrourelease_lock qu'après avoir attendu le délai d'attente ou appelé

    par la session détenant le verrou.

    De même, si vous souhaitez verrouiller un champ colonne A, alors créez un verrou get_lock("column A", 10) comme ci-dessus. Bref, c'est à l'application de décider de prendre ou non le verrou, et la base de données ne fournit que ce mécanisme. Pour voir si tout le monde récupère le même verrou, cela repose uniquement sur le fait que le premier paramètre, le nom du verrou, est une chaîne différente. Par conséquent, la meilleure pratique consiste à ajouter le nom de la table et le nom de la base de données devant le nom du verrou. pour éviter les dommages accidentels

    répondre
    0
  • Annulerrépondre