sql >> Databáze >  >> RDS >> Mysql

Spouštěče a zámek tabulky v MySQL

Myslím, že nejlepší způsob, jak to zvládnout, by bylo použít vzor SELECT ... FOR UPDATE popsaný zde:http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

Pro informaci:

 SELECT counter_field FROM child_codes FOR UPDATE; UPDATE child_codes
 SET counter_field = counter_field + 1; 

...

Takže ve vašem případě byste nahradili

LOCK TABLES AlarmCount WRITE, AlarmMembership READ;
  UPDATE AlarmCount SET num = num - 1 
  WHERE RuleId = OLD.RuleId AND
      MemberId = 0 AND
      IsResolved = OLD.IsResolved;

S něčím jako

SELECT num FROM AlarmCount WHERE RuleId = OLD.RuleId AND
          MemberId = 0 AND
          IsResolved = OLD.IsResolved FOR UPDATE;
UPDATE AlarmCount SET num = num - 1;

Říkám „něco jako“, protože mi není úplně jasné, co OLD.RuleId a OLD.IsResolved odkazují. Za zmínku také stojí http://dev.mysql .com/doc/refman/5.0/en/innodb-locking-reads.html je:

UPDATE child_codes SET counter_field = LAST_INSERT_ID(counter_field +
1); 
SELECT LAST_INSERT_ID();

Jinými slovy, pravděpodobně můžete tento vzor dále optimalizovat tak, že k tabulce přistoupíte pouze jednou... ale opět je zde několik podrobností o vašem schématu, které úplně nesleduji, a nejsem si jistý, zda mohu poskytnout skutečné prohlášení, které uvádíte. d potřebovat. Myslím si, že když se podíváte na VYBRAT... PRO AKTUALIZACI, uvidíte, na co se vzorec scvrkává a co musíte udělat, aby to ve vašem prostředí fungovalo.

Měl bych také zmínit, že existují určité úrovně prostředí úložiště a izolace transakcí, které budete chtít zvážit. Na toto téma je velmi, velmi dobrá diskuse o SO na toto téma zde:Kdy použít SELECT... FOR UPDATE?

Doufám, že to pomůže!




  1. Převod uhlíkového data na časové razítko mysql.

  2. Nejlepších n různých hodnot jednoho sloupce v Oracle

  3. Definování víceřádkových řetězců v psql

  4. Při rozdělování pevné hodnoty do zemí na základě denního podílu z příjmů vylučte určité hodnoty