Czy używasz tabel InnoDB czy tabel MyISAM? MySQL nie obsługuje transakcji na tabelach MyISAM (ale nie spowoduje błędu, jeśli spróbujesz ich użyć). Upewnij się również, że poziom izolacji transakcji jest odpowiednio ustawiony, powinien być SERIALIZABLE, co nie jest domyślne dla MySQL.
Ten artykuł ma dobry przykład, który wyjaśnia wpływ różnych poziomów izolacji na przykładzie bardzo podobnym do twojego.