Bitwa pod Aspern rozpoczęła się o 14.30 21 maja. Pierwsze, źle skoordynowane ataki Austriaków na Aspern i zalesiony obszar gminy Au załamały się, ale Karol nie ustępował. W końcu Austriakom udało się zdobyć wioskę, ale zaraz ponownie utracili jej wschodnią część. Do godziny 18 Austriacy nie atakowali Essling, ponieważ wyznaczone do tego kolumny miały długą drogę do przebycia. Do wieczora Francuzi odparli wszystkie ataki na Essling. Ponowny bój rozpoczął się 22 maja o 3 nad ranem i po czterech godzinach Francuzi zajęli Aspern ponownie. Napoleon miał teraz 71 000 ludzi i 152 działa po drugiej stronie rzeki, ale na Marchfeld Francuzów było wciąż niebezpiecznie mało. Teraz Napoleon przypuścił zmasowany atak na austriackie centrum, co miało dać czas III Korpusowi na sforsowanie rzeki i uderzyć dla zapewnienia pełnego zwycięstwa. Lannes ruszył naprzód na czele trzech dywizji piechoty spychając przeciwnika półtora kilometra w tył, nim wreszcie Austriacy, poderwani do boju przez samego arcyksięcia, zdołali zmusić Francuzów do odwrotu. O godz. 9 francuski most został zerwany. W godzinę później Karol przypuścił frontalny atak na przyczółek i ostatecznie odebrał Aspern, ale obrońcy Essling nie dali się jeszcze. Po kilku następnych godzinach Austriacy uderzyli ponownie zajmując całą wioskę oprócz uparcie bronionego spichrza. Napoleon w odpowiedzi rzucił część Gwardii Cesarskiej pod wodzą Rappa, który z nieznanych przyczyn nie wykonał napoleońskiego rozkazu wzięcia Essling i wyparcia sił austriackich. Tymczasem Karol rozpoczął ciężki ostrzał pozycji francuskich, co kosztowało śmierć wielu żołnierzy, a wśród nich marszałka Lannesa. Wkrótce potem walki ustały, a Francuzi wycofali się na Lobau. Arcyksiążę Karol zadał Napoleonowi pierwszą klęskę w karierze cesarza.