Cengiz Under had given Roma the half-time lead in Ukraine, but Facundo Ferreyra and Fred gave Shakhtar Donetsk a 2-1 first leg result.
This was the first leg in the Round of 16 and took place in Kharkiv, as the stadium in Donetsk was damaged by the civil war. Shakhtar had knocked Napoli out of the Champions League, while the Giallorossi topped their group ahead of Chelsea and Atletico Madrid. Darijo Srna was suspended after failing a doping test and Maksum Malyshev was injured, while Alessandro Florenzi started despite a flu bug and on-form Cengiz Under received his Champions League debut.
Both sides had early chances, as Aleksandar Kolarov did enough to stop a Fred tap-in, then on a corner Edin Dzeko was denied from close range by Andriy Pyatov.
Marlos cut inside Kolarov and his cross-shot went through Alisson’s legs, but the goalkeeper caught it with a trailing hand.
The Kostas Manolas free header from a corner was wide, but even worse was Dzeko passing it to Pyatov at the end of a well-worked move between Under and Diego Perotti.
Perotti cut inside past two only for Dzeko’s weak finish to be charged down, then Rakitskiy made an acrobatic mid-air interception to stop Under sending Radja Nainggolan clear.
Dzeko was decisive in the end with a perfect assist, his slide-rule pass sending Cengiz Under clear down the right and the finish bounced off desperate Pyatov into the empty net. It was his fifth goal in four competitive games and a perfect way to mark his first ever Champions League appearance.
There was another serious blow for Shakhtar before the break, as defender Serhiy Kryvstov landed very badly on his ankle, spraining it visibly, and had to be stretchered off.
Straight after the restart, Shakhtar got their equaliser thanks to a massive defensive error. Florenzi, who had been in doubt to the last minute with a stomach bug, failed to cut out a through ball when caught too far upfield and Facundo Ferreyra sprinted past Manolas to fire in.
Florenzi made a similar error moments later, then Marlos was found unmarked from 10 yards only to be denied by a spectacular Alisson save with his wrist.
The Brazilian goalkeeper out-did himself with an even more stunning save, flying to claw a Taison strike one-handed out of the far top corner.
However, Alisson was finally beaten when Fred curled a free kick in off the underside of the crossbar, where the goalkeeper just couldn’t reach, to turn the game around completely.
The visibly unwell Florenzi and Cengiz Under made way for Bruno Peres and Gerson, the Brazilian midfielder forcing two saves from Pyatov.
It was almost 3-1 to the hosts with the last kick of the game after another defensive error, but Bruno Peres lifted his foot to clear off the line from Ferreyra.
The last time Roma lost a Champions League match after taking the lead was in 2011, also against Shakhtar Donetsk.
Shakhtar Donetsk 2-1 Roma
Cengiz Under 41 (R), Ferreyra 52 (S), Fred 71 (S)
Shakhtar Donetsk: Pyatov; Butko, Kryvtsov (Ordets 45), Rakitskiy, Ismaily; Fred, Stepanenko; Marlos, Taison, Bernard (Kovalenko 91); Ferreyra
Roma: Alisson; Florenzi (Peres 72), Manolas, Fazio, Kolarov; De Rossi, Strootman; Cengiz Under (Gerson 72), Nainggolan (Defrel 82), Perotti; Dzeko
Ref: Collum (SCO)
See the latest Serie A predictions and betting tips with Eurotips.co.uk