hard mistakes - please write a commentsome mistakesokgoodvery good
Loading ... Loading ...

MySQL Update Deadlock InnoDB

Ein kniffeliges Problem ist letztens aufgetreten bei einer partitionierten MySQL Datenbank. Es kam immer wieder bei hoher Last zu Deadlock Meldungen seitens MySQL. Immer waren 2 Queries davon betroffen, die dieselbe Form hatten:

--Query1:
UPDATE myTable SET createdOn='2016-05-23 16:08:29', foo='y' WHERE id=1
--Query2:
UPDATE myTable SET createdOn='2016-05-23 16:08:29', foo='x' WHERE id=2

Im MySQL Error Log war ein solcher Eintrag zu finden:

mysql tables in use 1, locked 1
LOCK WAIT 106 lock struct(s), heap size 8400, 53 row lock(s)

Tip: Mit der Systemvariablen innodb_print_all_deadlocks (ab MySQL 5.5) kann man Deadlocks in InnoDB in das MySQL Error Log loggen und besser debuggen.

Eigentlich sollte es bei den beiden Queires nicht zu einem Deadlock kommen, da beide nur jeweils ein Row-Level Lock auf ihrer jeweilige Zeile haben sollten.

Dies ist auch der Fall, wenn es einen Index auf der Spalte id gibt. In diesem Fall allerdings war durch die Partitionierung der Primary (Unique) Index auf  2 Spalten gelegt worden (kombinierten Index): id und createdOn.

Dadurch, dass der Index auf beiden Soalten gelegt worden ist, kam es zu den dem Dealocks. Die Lösung war, das createdOn aus dem Update Statement zu entfernen, weil es an der Stelle auch keinen Sinn gemacht hat.

hard mistakes - please write a commentsome mistakesokgoodvery good
Loading ... Loading ...

Redis Replikation Tipps

Beim Betrieb von Redis im Master/Slave Modus muss darauf geachtet werden, dass:

1. Master und Slave sind nicht immer auf demselben Stand

Redis uses asynchronous replication. Starting with Redis 2.8, however, slaves will periodically acknowledge the amount of data processed from the replication stream.

D.h. bestimmte Daten müssen vom Master abgefragt werden, wie z.B. Session Daten

2. Safety of replication when master has persistence turned off

In setups where Redis replication is used, it is strongly advised to have persistence turned on in the master, or when this is not possible, for example because of latency concerns, instances should be configured to avoid restarting automatically.

To better understand why masters with persistence turned off configured to auto restart are dangerous, check the following failure mode where data is wiped from the master and all its slaves:

We have a setup with node A acting as master, with persistence turned down, and nodes B and C replicating from node A.
A crashes, however it has some auto-restart system, that restarts the process. However since persistence is turned off, the node restarts with an empty data set.
Nodes B and C will replicate from A, which is empty, so they’ll effectively destroy their copy of the data.

When Redis Sentinel is used for high availability, also turning off persistence on the master, together with auto restart of the process, is dangerous. For example the master can restart fast enough for Sentinel to don’t detect a failure, so that the failure mode described above happens.

Every time data safety is important, and replication is used with master configured without persistence, auto restart of instances should be disabled.

d.h. die auto restart Funktion sollte für den Master deaktiviert werden, falls keine sofortige Persistierung auf der Festplatte aktiviert ist.

3. Master Ausfall

Wenn der Master ausfällt, sollte der Slave nach eine Karenzzeit sich zum Master erklären (z.B. nach 10 Minuten).

hard mistakes - please write a commentsome mistakesokgoodvery good
Loading ... Loading ...

PHPUnit @Depends Variablen im @Dataprovider verwenden

Leider ist es zur Zeit nicht möglich für einen PHPUnit Test sowohl einen anderen Test als Vorraussetzung für einen Test zu markieren, damit die Ausführung des Tests im Fehlerfall nicht stattfindet, und gleichzeitig einen Dataprovider für den Test zu verwenden der auf das Ergebnis einen vorherigen Tests zugreift. Das liegt daran, dass Dataprovider vor dem Durchlaufen der Tests initilisiert werden von PHPunit.

Das Problem

class StackTest extends PHPUnit_Framework_TestCase {
    protected static $foo;

    public function provider() { 
        print_r( self::$foo); //does not work
    }

    /**
     * @dataProvider provider
     */
    public function testOne() {
        self::$foo = array();
    }

    /**
     * @depends testOne
     * @dataProvider provider
     */
    public function testTwo( $data ) { 
    }

weiterlesen…

hard mistakes - please write a commentsome mistakesokgoodvery good
Loading ... Loading ...

Redis Scripte mit Lua programmieren

Zum Einfügen eines Datensatzes in eine Datenbank in Redis mittels Script kann man folgendes Script in einer Datei speichern und ausführen:

Script File “redis_insert.lua”:

 redis.call("select", 1)
 redis.call('set', 'myKey', 'myValue')

Auf der Console kann dann mittels des folgenden Befehls das Script ausgeführt werden und die Daten in den Redis Server geschrieben werden:

redis-cli --eval redis_insert.lua
hard mistakes - please write a commentsome mistakesokgoodvery good 5,00 of 500 (1 Users)
Loading ... Loading ...
hard mistakes - please write a commentsome mistakesokgoodvery good
Loading ... Loading ...

PHPUnit mit Codeigniter 3 installieren

Um PHPUnit mit Codeigniter 3 zu verwenden benötigt man die Erweiterung ci-phpunit-test die mindestens PHP Version 5.4 voraussetzt.

Die neuste Version von PHPunit benötigt PHP 5.6, es sollte also eine möglichst aktuelle PHP Version installiert sein.

Als kann PHPUnit installiert werden.

Dann kann man den application/test Ordner aus dem downloadbaren .zip Archiv von ci-phpunit-test in das Codeigniter Projekt entpackt werden. weiterlesen…

hard mistakes - please write a commentsome mistakesokgoodvery good
Loading ... Loading ...

Das Soap Protokoll mit XML mit PHP – eine Einführung

Das Soap (Simple Object Access Protocol) ist eine Netzwerkprotokoll, mit dessen Hilfe Daten zwischen Systemen ausgetauscht und Remote Procedure Calls durchgeführt werden können (Wikipedia).

Meistens werden Nachrichten im XML Format mittels eines HTTP Post-Request im Body zwischen einem Client und einem Server gesendet. Für das Nachrichtenformat wird kein Format vorgegeben, sondern nur ein Framework zur Verfügung gestellt. Verwandte System sind REST und Cobra. Alle Systeme dienen zur Entkopplung/Abstraktion und Interoperabilität von Applikationen und dienen als Middleware zwischen verschiedenen Applikationen, die unterschiedliche Programmiersprachen oder Technologien verwenden können.

Die Vorteile werden durch leicht erhöhten Rechenaufwand und erhöhtem Datenvolumen erkauft.

Der Aufbau einer XML Soap Nachricht weiterlesen…

hard mistakes - please write a commentsome mistakesokgoodvery good
Loading ... Loading ...

VBA Excel: Mouse Pointer über eine Zelle als aktiv markieren

Leider gibt es keine Möglichkeit über VBA sich an einen Event zu registrieren, wenn der Mouse Pointer über einer Zelle ist.

Die einzige Möglichkeit dies zu umgehen, ist ein Makro auf ein Bild/Button in einer Zelle zu legen, was dann ausgeführt wird. Wenn einer Zelle ein Makro zugeordnet ist, wird der Mouse Pointer automatisch aktiv und macht den User darauf aufmerksam, dass eine aktive Klickmöglichkeit vorliegt.

Ein Makro auf eine Zelle verlinken

  1. einfügen eines durchsichttbaren .png Files oder eines sichtbaren Bildes/Buttons in die Zelle
  2. rechte Maustaste auf das eingefügt Objekt
  3. Makro zuweisen
  4. Jetzt ist die Maus aktiv, wenn man über das Bild fährt
hard mistakes - please write a commentsome mistakesokgoodvery good
Loading ... Loading ...

PHP 7 – die neuen Funktionen im Überblick – Teil 2

Expectations

Mit Expactations lassen sich Stellen im Code markieren, die eigentlich nicht erreicht werden sollen, aber falls doch, eine Nachricht in der Produktionsumgebung hinterlassen könnnen, um anderen Programmierern beim Debuggen und verstehen des Codes zu helfen. Der Parameter expression wird ausgewertet und bei einem false-Wert wird eine AssertionException geworfen.

Definition:

void assert (mixed $expression [, mixed $message]);

Die php.ini Konfigurationsvariable zend.assertions kann 3 Wert annehmen weiterlesen…

hard mistakes - please write a commentsome mistakesokgoodvery good 5,00 of 500 (1 Users)
Loading ... Loading ...

PHP 7 – die neuen Funktionen im Überblick – Teil 1

PHP 7 ist in aller Munde und kommt mit einer Reihe syntaktischer Verbesserungen und neuen Features herbei. In Zukunft sind PHP-Applikationen nicht nur schneller, sondern nähern sich dem Java-Syntax weiter an. Endlich kann man festlegen, welche Datentypen in Funktionen herein und welche wieder heraus kommen sollen (Parameter Type Declarations und Return Type Declarations), wodurch die Wartbarkeit des Codes verbessert werden kann.

Parameter Type Declarations und Return Type Declarations

In PHP >=5.3. war es schon früher möglich Funktionsparametern, einer Input Variablen einen Objekttyp zuzuweisen, den die Funktion erwartet hat, um anderen Programmierern die Verwendung der Funktion zu erleichtern/zu dokumentieren und eine Exception zu generieren, wenn ein Objekt eines anderen Typs verwendet wird: weiterlesen…