2016-06-27 22 views
5

Mam dość google i mam dość przyzwoitego czytania ze zrozumieniem, ale nie rozumiem, czy ten skrypt będzie działał w wielu wątkach na moim polu postgres/postgis. Oto kod:Jaki jest zakres tabeli TemgreSQL?

Do 
$do$ 
DECLARE 
    x RECORD; 
    b int;  
    begin 
    create temp table geoms (id serial, geom geometry) on commit drop; 

    for x in select id,geom from asdf loop 

     truncate table geoms; 
     insert into geoms (geom) select someGeomfield from sometable where st_intersects(somegeomfield,x.geom); 

     ----do something with the records in geoms here...and insert that data somewhere else 

    end loop; 
end; 
$do$ 

Tak, jeśli uruchomię to na więcej niż jednego klienta, zwany z Java, będzie zakres geoms temp tabeli przyczyna problemów? Jeśli tak, pomocne byłyby pomysły na rozwiązanie tego problemu w PostGres.

Dzięki

Odpowiedz

3

Jedna subtelna pułapka, w którą wpadniesz, dlatego nie jestem całkiem gotowa, aby ogłosić, że jest "bezpieczna" jest to, że zakres jest na sesję, ale ludzie często zapominają upuścić stoły (więc spadają po rozłączeniu) .

Myślę, że jesteś o wiele lepiej, jeśli nie potrzebujesz tabeli tymczasowej po funkcji, aby rzucić ją bezpośrednio po zakończeniu pracy. Zapobiegnie to problemom wynikającym z próby uruchomienia funkcji dwukrotnie w tej samej transakcji. (Przy zatwierdzaniu, które zrzucasz)

+0

dziękuję Chris ... odkąd mam "przy zatwierdzeniu upuszczenia" na tabeli tymczasowej DDL, pomyślałem, że "zatwierdzenie" oznacza, że ​​po zakończeniu połączenia tabela tymczasowa została odrzucona ... ale być bezpiecznym, słyszę cię. – markg

+0

Zobowiązanie przy okazji oznacza faktyczne zatwierdzenie. Jeśli użyjesz 'begin', a następnie uruchomisz swoją funkcję dwa razy, przed wywołaniem' commit', to się nie powiedzie. To samo, jeśli w jakiś sposób zostanie wywołane dwa razy w tym samym zapytaniu. –

1

tabel tymczasowych w PostgreSQL (lub PostgreSQL) (PostgreSQL nie istnieje) są tylko lokalnie i związane z sesji, gdzie są one utworzone. Dlatego żadne inne sesje (klienci) nie mogą wyświetlać tabel tymczasowych z innej sesji. Zarówno (schemat i dane) są niewidoczne dla innych. Twój kod jest bezpieczny.