Substitute Ashley Fletcher nipped in to turn home a rebound nine minutes from time to hand the win to Barnsley who kept their faint play-off hopes alive.
Rovers were an improvement on their disappointing performance against Sheffield United the previous week but remain a world away from their best under Darren Ferguson.
Though they improved after the break, they looked like a side without form, showing moments of nerves and sloppy play.
Barnsley on the other hand had plenty of confidence and stuck to their game plan even when things were not going theirn way.
Darren Ferguson recalled Thorsten Stuckmann in goal with Chris Neal returning to parent club Port Vale. Andy Butler and Lynden Gooch both dropped to the bench with Mitchell Lund and Conor Grant coming in.
Paul Heckingbottom made just one change to the Barnsley side that lost at Gillingham with Marc Roberts replacing loanee Kevin Long who has returned to parent club Burnley.
Barnsley started the brighter of the sides and really should have been ahead just seven minutes in.
Adam Hammill skipped past two challenges before powering into the box via a neat one-two only to produce a terribly tame shot straight at Thorsten Stuckmann.
Andy Williams brought down a high ball with a superb first touch but his attempt to curl a shot in from the edge of the box lacked similar cuteness.
Hammill cut inside off the left with a couple of step overs before curling a shot just wide from 20 yards.
At the other end the recalled Mitchell Lund should have put Rovers in front. He darted in to meet a corner completely unmarked but could only scuff a header well wide.
Aidan White was forced off after falling awkwardly following a foul from Conor Grant. George Williams was brought on to replace him.
Stuckmann produced a superb save as Alfie Mawson powered a header from point blank range.
After barely having a sniff of goal for much of the half, Rovers were inches away from taking the lead three minutes from the break.
Cedric Evina produced a superb run down the left, leaving James Bree standing before spotting the run of Paul Keegan who scruffily struck first time from the cut back but scuffed wide.
Rovers would indeed finish the half with their brightest spell of the game though there will have been some sense of relief that they did not go in behind.
Ferguson sent on James Coppinger for Harry Middleton at the break, dropping Grant deeper. And soon after he switched Stewart for Craig Alcock with Mitchell Lund switching to wing back.
Rovers began to enjoy more of the ball and had a glorious chance to take the lead.
They swept forward and Coppinger spotted the run of Lund, feeding him into acres of space on the corner of the box but his shot was straight at Adam Davies.
Clear cut chances were few and far between for both sides as the half wore on with the game balancing out.
But Barnsley would finish the stronger and threatened before they took the lead.
Conor Hourihane nicked the ball from Grant and smashed a shot towards the top corner only for Stuckmann to tip wide.
Substitute Williams clipped a superb cross in from the byline with Winnall rising but only able to send a tame header on goal.
The goal did come though, nine minutes from time.
Hourihane drilled a low shot which Stuckmann parried only for substitute Ashley Fletcher to dart in and turn home the rebound.
Ferguson threw on Lynden Gooch to chase the game but Rovers could not find a way in.
Barnsley: Davies, Bree, Roberts, Mawson, White (Williams 24), Isgrove (Fletcher 60), Brownhill (Scowen 60), Hourihane, Hammill, Watkins, Winnall. Subs not used: Townsend, Tuton, Nyatanga, Khan.
Rovers: Stuckmann, Lund, McCullough, Taylor-Sinclair, Evina, Stewart (Alcock 52), Keegan (Gooch 82), Middleton (Coppinger 46), Grant, Williams, Tyson. Subs not used: Marosi, Butler, Chaplow, Mandeville.
Referee: Andrew Madley (West Yorkshire)
Attendance: 11,638 (1,421 away)