31 Mart 2023 Cuma

Distributed Lock

Giriş
lock_key alanı kilit ismini belirtiyor ve tekil

Örnek - Sadece Unique Key
Şöyle yaparız
CREATE TABLE lock (
  id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  lock_key VARCHAR(256) NOT NULL,
  holder VARCHAR(256) NOT NULL,
  creation_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uniq_lock_key (lock_key)
);
Kullanmak için şöyle yaparız
// Acquire lock
INSERT INTO lock(lock_key, holder) VALUES ('project1_uid1', 'server1_ip1_tid1');

// Release lock
DELETE FROM `lock` WHERE lock_key = 'project1_uid1';
Örnek - Optimistic Lock
Şöyle yaparız
CREATE TABLE lock_table
(
 id INT AUTO INCREMENT COMMENT 'primary key',
 value VARCHAR(64) NULL COMMENT 'locked resource',
  version INT DEFAULT 0 NULL COMMENT 'version'
 CONSTRAINT lock_table_pk
  PRIMARY KEY (id)
);

UPDATE lock_table SET value = ..., version = #{version} + 1 
 WHERE id = #{id} AND version = #{version};

Örnek - Sadece Unique Key + TLL
Şöyle yaparız. Burada TTL ile kilidi alan uygulama çökerse yani belli bir süre içinde kilidi bırakmazsa bir başka uygulama kilidi alabiliyor
CREATE TABLE lock (
  id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  lock_key VARCHAR(256) NOT NULL,
  holder VARCHAR(256) NOT NULL,
  creation_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, last_lock_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uniq_lock_key (lock_key)
);
Kullanmak için şöyle yaparız
// Aquire lock
UPDATE lock SET holder = 'server1_ip1_tid1', last_lock_time = ${now} 
WHERE 
  lock_key = 'project1_uid1' and 
  last_lock_time < ${now} - ${timeout};

// Release lock
UPDATE lock SET holder = '', last_lock_time = ${min_timestamp} 
WHERE 
  lock_key = 'project1_uid1' and 
  holder = 'server1_ip1_tid1';
Örnek - FOR UPDATE İle Pessimistic Lock
Şöyle yaparız
CREATE TABLE lock (
  id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  lock_key VARCHAR(256) NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY uniq_lock_key (lock_key)
);
Kullanmak için şöyle yaparız
// Acquire lock
BEGIN
SELECT * FROM demo.lock WHERE lock_key = 'project1_uid1' FOR UPDATE;

// Nonblocking Try lock
BEGIN
SELECT * FROM demo.lock WHERE lock_key = 'project1_uid1' FOR UPDATE NOWAIT;

// Relese Lock
COMMIT;


Hiç yorum yok:

Yorum Gönder

Soft Delete

Giriş Açıklaması  şöyle When using the soft delete mechanism on the database, you might run into a situation where a record with a unique co...