Millwall ended a run of three matches without a win as Liam Trotter's brace gave them victory over Doncaster.
The midfielder opened the scoring via a penalty after John Marquis was tripped before Billy Sharp replied for Rovers from the spot after he was fouled.
Trotter then netted his second with a run and shot under the despairing dive of Doncaster keeper Carl Ikeme.
Darius Henderson made it 3-1 to the home side before Sharp netted again with four minutes to go.
Doncaster have won just one of their last nine and are now seven points from safety at the bottom of the table.
For the Lions, the win moves them up to 17th, two points above the relegation zone.
VIEWS FROM THE DRESSING ROOM
Doncaster manager Dean Saunders told BBC Radio Sheffield:
"We played really well. I thought we created chances and scored two great goals.
"But [Millwall's goals] they're mistakes, ridiculous mistakes.
"We've scored two goals away from home and come away with nothing."
Sorry, we were unable to load match stats, please try again.
Live Text Commentary
Full Time The referee ends the match.90:00 +3:38
Direct free kick taken by Jack Smith.90:00 +3:38 Booking
Booking James O'Connor goes into the referee's book for unsporting behaviour.90:00 +3:34
James Henry fouled by James O'Connor, the ref awards a free kick.90:00 +2:18
Effort on goal by Marc-Antoine Fortune from long range goes harmlessly over the target.90:00 +1:54
Hamer Bouazza takes a shot from 12 yards. Carl Ikeme makes a save.89:58
Outswinging corner taken from the right by-line by James Coppinger, Header from deep inside the area by Herita Ilunga goes harmlessly over the crossbar.88:26
Shot by Jay Simpson. Clearance made by Herita Ilunga. Short corner taken by Hamer Bouazza.87:12
Kyle Bennett produces a right-footed shot from just outside the penalty box that goes wide left of the target.85:04
The assist for the goal came from Kyle Bennett.85:04 Goal scored
Goal! - Billy Sharp - Millwall 3 - 2 Doncaster Billy Sharp scores a headed goal from inside the six-yard box. Millwall 3-2 Doncaster.83:08
Assist by Hamer Bouazza.83:08 Goal scored
Goal! - Darius Henderson - Millwall 3 - 1 Doncaster Darius Henderson finds the net with a headed goal from just inside the penalty area. Millwall 3-1 Doncaster.82:14
A cross is delivered by Hamer Bouazza,82:14 Booking
Booking Simon Gillett shown a yellow card.82:04
Foul by Simon Gillett on James Henry, free kick awarded.81:08
Foul by Darren Ward on Marc-Antoine Fortune, free kick awarded. Billy Sharp has a direct shot on goal from the free kick.79:44 Substitution
Substitution James Coppinger on for Brian Stock.79:44 Substitution
Substitution Herold Goulon goes off and Mark Wilson comes on.78:59 Substitution
Substitution James Henry on for Liam Feeney.
Marc-Antoine Fortune takes a shot. Darren Ward gets a block in. Corner taken by Giles Barnes, Steve Mildenhall makes a save.75:58
The referee gives a free kick against Marc-Antoine Fortune for handball. Free kick taken by Nathan Baker.74:29 Substitution
Substitution Hamer Bouazza is brought on as a substitute for Scott Barron.74:29
Inswinging corner taken by Scott Barron from the right by-line, save made by Carl Ikeme. Shot on goal by Shane Lowry from just inside the area goes over the target.72:47 Substitution
Substitution Habib Beye leaves the field to be replaced by Kyle Bennett.72:47
Foul by Darius Henderson on Habib Beye, free kick awarded. Herold Goulon takes the direct free kick.71:49
Herold Goulon challenges Jay Simpson unfairly and gives away a free kick. The ball is swung over by Jack Smith, Scott Barron produces a right-footed shot from inside the area that clears the crossbar.70:48
Giles Barnes concedes a free kick for a foul on Scott Barron. Free kick taken by Nadjim Abdou.70:23
Foul by Liam Trotter on Marc-Antoine Fortune, free kick awarded. Herita Ilunga takes the direct free kick.69:42
Herold Goulon has an effort at goal from outside the area missing to the wide left of the goal.67:17
Free kick crossed right-footed by Brian Stock from right wing, Jack Smith manages to make a clearance.67:17 Booking
Booking Shane Lowry goes into the referee's book for unsporting behaviour.66:49
Unfair challenge on Marc-Antoine Fortune by Shane Lowry results in a free kick.65:46
Shot from 20 yards from Jay Simpson. Sam Hird gets a block in. Corner taken by Liam Feeney, clearance by Herold Goulon.65:22
The referee blows for offside. Steve Mildenhall takes the free kick.64:17
Darius Henderson takes a shot. Save by Carl Ikeme.60:03 Substitution
Substitution Darius Henderson joins the action as a substitute, replacing John Marquis.60:03
Free kick awarded for an unfair challenge on Sam Hird by John Marquis. Sam Hird takes the free kick.57:36
Drilled right-footed shot by Brian Stock. Darren Ward gets a block in.56:44
Shot by John Marquis. Blocked by Brian Stock. Inswinging corner taken right-footed by Liam Feeney from the left by-line, save by Carl Ikeme.54:57
Free kick awarded for a foul by Simon Gillett on Jay Simpson. The ball is crossed by Scott Barron, Shane Lowry takes a shot. Sam Hird makes a clearance.51:44
Shot by Marc-Antoine Fortune. Save made by Steve Mildenhall. Corner taken right-footed by Brian Stock to the near post, Marc-Antoine Fortune produces a right-footed shot from deep inside the penalty area which goes wide of the right-hand post.50:46
Marc-Antoine Fortune concedes a free kick for a foul on Liam Trotter. Darren Ward takes the free kick.50:16
Effort on goal by Jack Smith from deep inside the area goes harmlessly over the bar.48:19
Foul by Herold Goulon on Nadjim Abdou, free kick awarded. Direct free kick taken by Jack Smith.45:26
Unfair challenge on Giles Barnes by Nadjim Abdou results in a free kick. Brian Stock takes the free kick.45:01
The referee gets the second half started.45:00 +2:13 Half time
Half Time The first half comes to an end.45:00 +0:02
Inswinging corner taken right-footed by Liam Feeney, save by Carl Ikeme. Jack Smith has a shot on goal from outside the box which misses left.43:21
Free kick awarded for a foul by Liam Feeney on Herita Ilunga. Herita Ilunga takes the free kick.41:58 Goal scored
Goal! - Liam Trotter - Millwall 2 - 1 Doncaster A goal is scored by Liam Trotter from deep inside the penalty box to the bottom left corner of the goal. Millwall 2-1 Doncaster.40:42
Foul by Liam Feeney on Brian Stock, free kick awarded. Carl Ikeme takes the free kick.39:12 Goal scored
Goal! - Billy Sharp - Millwall 1 - 1 Doncaster Power penalty scored by Billy Sharp. Millwall 1-1 Doncaster.38:14
Scott Barron concedes a Penalty for a foul on Billy Sharp.37:02
Marc-Antoine Fortune is penalised for handball and concedes a free kick. Steve Mildenhall takes the free kick.35:41
Scott Barron takes the inswinging corner, Unfair challenge on Carl Ikeme by Darren Ward results in a free kick. Direct free kick taken by Carl Ikeme.34:36
Shot by Jay Simpson. Save by Carl Ikeme.34:00
Unfair challenge on John Marquis by Sam Hird results in a free kick. Scott Barron restarts play with the free kick.30:50
The referee blows for offside. Darren Ward takes the free kick.30:26
Herold Goulon takes a shot. Jack Smith makes a clearance.29:05
The referee penalises Marc-Antoine Fortune for handball. Steve Mildenhall takes the free kick.26:26 Booking
Booking John Marquis goes into the referee's book.26:22
Direct free kick taken by Carl Ikeme.26:22 Booking
Booking Caution for Habib Beye.25:37
Unfair challenge on Habib Beye by John Marquis results in a free kick.25:09
Assist by John Marquis.24:21 Goal scored
Goal! - Liam Trotter - Millwall 1 - 0 Doncaster Liam Trotter scores a placed penalty. Millwall 1-0 Doncaster.23:25
Foul by Brian Stock on John Marquis, Penalty awarded.21:50
Herita Ilunga is penalised for a handball. The ball is delivered by Scott Barron, Headed effort from deep inside the penalty area by Nathan Baker misses to the left of the goal.19:45
Marc-Antoine Fortune gives away a free kick for an unfair challenge on Nathan Baker. Steve Mildenhall restarts play with the free kick.17:52
John Marquis concedes a free kick for a foul on Habib Beye. Free kick taken by Brian Stock.17:25
Headed effort from inside the area by James O'Connor misses to the left of the target.13:06
Herita Ilunga gives away a free kick for an unfair challenge on Liam Feeney. The ball is swung over by Scott Barron, Liam Feeney takes a shot. Clearance made by Sam Hird.9:06
Unfair challenge on Brian Stock by John Marquis results in a free kick. Sam Hird restarts play with the free kick.8:24
John Marquis concedes a free kick for a foul on Sam Hird. Carl Ikeme restarts play with the free kick.4:40
Liam Trotter takes a shot. Save by Carl Ikeme. Inswinging corner taken right-footed by Liam Feeney, clearance by Herold Goulon.4:15
Liam Feeney fouled by Herold Goulon, the ref awards a free kick. Direct free kick taken by Scott Barron.0:51
Simon Gillett takes the chance to get an effort at goal. Blocked by Nadjim Abdou.0:00
The ref blows the whistle to start the match.
Live data and text provided by our data suppliers