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