Otomatik Mühendis

Kilitli Tablolar

günü tarafından yayınlandı.

Bazen veritabanından bir veri çekerken yanıt alamayız. O sırada ilgili tablo başka bir işlem tarafından güncellenmektedir ve veritabanı sunucusu bize en güncel halini sunabilmek için bizi bekletir. Bu durumu tablo yerine satır bazlı kilitlerle veya hiç veriyi kilitlemeden çözebiliriz.

Aşağıda bu duruma düştüğünüzde sizi kurtaracak scriptler mevcuttur. Hangi tabloların neden kilitlendiğini öğrenebilirsiniz. İyi bir ekipte bunu yazılımcı yerine db adminlerin kontrol ediyor olması gerekir. Yazılımcı tabloları kilitlemeyecek şekilde kodunu yazmalıdır.

MSSQL (T-SQL)

1
2
3
4
5
6
7
8
9
10
USE master

--Çalışmakta olan işlemler
SELECT * from sys.sysprocesses;

--SQL sunucusunda aktif bağlantılar
exec sp_who 'active';

--Kilitli tablolar
EXEC sp_lock;

Oracle (PL\SQL)

Oracle için özel bir not olarak şunu düşelim: Oracle’da oluşturulan stored procedureler (önceden yazılmış, veritabanı ile birlikte tutulan methodlar) o prosedürü derleyen kişinin yetkisi ile çalışırlar. Kilitli tabloları gösteren bu sorguyu yetki sınırlandırması sebebiyle çalıştıramıyorsanız, bunu içeren bir sp’yi adminin derlemesini isteyebilirsiniz. Daha sonra sp’yi her çağırdığınızda onun yetkisiyle çalışacaktır.

1
2
3
4
5
6
7
8
9
10
11
12
13
select c.owner
, c.object_name
, c.object_type
, b.sid
, b.serial#
, b.status
, b.osuser
, b.machine
from v$locked_object a
, v$session b
, dba_objects c
where b.sid = a.session_id
  and a.object_id = c.object_id;

Ufak bir not daha: SQL sorgularını bu şekilde noktalama işareti satır başına gelecek şekilde yazarsanız imla kuralları açısından rahatsız edici olabilir ama debug sırasında satırları kolaylıkla yorum satırı yapmanıza imkan tanır. Bu örnekte olduğu gibi yorum satırı virgül akışı bozmaz.

MySQL

1
2
3
4
SHOW OPEN TABLES
WHERE 'Table' LIKE '%foo%'
    AND Database LIKE '[DBNAME]'
    AND In_use > 0;

MongoDB

Yok. Tablo da yok, kilit de yok.