The visitors, dismissed for 163 after winning the toss, held England to 161 for five from 20 overs.
England's Paul Collingwood, with four for 22, returned the best figures in the seven-match history of Twenty20 international cricket but it was not enough to give his team a win.
Opener Marcus Trescothick then took England to the brink of victory with 72 off 57 balls including one six and nine fours.
But when he was alertly run out by wicket-keeper Kumar Sangakkara, England still needed 12 off eight balls.
That became nine off the final over, bowled by paceman Dilhara Fernando. The target ultimately came down to five off one ball with Tim Bresnan, on his senior England debut, facing.
It was too much for the 21-year-old Yorkshire bowler, who finished on six not out with wicket-keeper Geraint Jones unbeaten on 14.
Arguably more concerning for England, was the serious ankle injury sustained by batsman Ed Joyce in only the second over of the match.
Irish-born Middlesex left-handed batsman Joyce, going for a catch at third man after man-of-the-match Sanatah Jayasuriya uppercut a Stephen Harmison delivery, slipped as his right ankle gave way underneath him.
As the ball went for four Joyce, clearly in severe pain, signalled immediately for help and play was held up for 12 minutes while he received treatment from the England medical staff.
The 27-year-old was eventually helped into an ambulance driven onto the outfield and taken to hospital.
An England statement said Joyce, whose condition was to be re-assessed Friday, had suffered soft tissue damage after spraining his ankle but X-rays had shown no fracture.
Earlier Thursday Glen Chapple (abdominal strain) withdrew from the squad as he too joined a growing England injury list featuring fellow seamers Simon Jones (knee) and James Anderson (back) as well as left-arm spinner Ashley Giles (hip).
Colingwood's return got England back into the match after Sri Lanka, who had been 75 without loss, collapsed after a rapid opening stand between Jayasuriya (41) and Upul Tharanga (34).
The Durham all-rounder, the hero of England's 100-run win over Australia in the home team's only previous Twenty20, at the Rose Bowl last year, when he took two for eight and top-scored with 46, saw his return Thursday beat England team-mate Jon Lewis's four for 24.
But it was Jayasuriya who produced the all-round heroics this time, taking two for 32 with his left-arm spin.
Sri Lanka's victory was all the more creditable as they had omitted their two most experienced bowlers in champion off-spinner Muttiah Muralitharan and left-arm quick Chaminda Vaas.
At half-way, England were behind the rate at 92 for one.
They lost three middle-order wickets in quick succession, including hard-hitting Kevin Pietersen (17), on his Hampshire home ground, and Collingwood (five).
Entering the closing stages, England needed 32 off 16 balls.
Trescothick gave them hope with three successive fours off slingshot action paceman Lasith Malinga before he was dismissed.
Earlier medium-pacer Collingwood made the breakthrough for England when Tharanga played on.
After Sri Lanka captain Mahela Jayawardene was run out for nought, Collingwood then had Jayasuriya lbw before he dismissed Russel Arnold.
Collingwood then claimed his fourth victim when Kumar Sangakkara (21) chipped him to stand-in England captain Andrew Strauss at short mid-wicket.
This fixture was the curtain-raiser to a five-match one-day series between England and Sri Lanka which starts at Lord's on Saturday.
Final scoreboard in the Twenty20 match between England and Sri Lanka at the Rose Bowl here Thursday:
Fall of wickets: 1-75, 2-75, 3-84, 4-84, 5-102, 6-117, 7-136, 8-154, 9-161, 10-163
Fall of wickets: 1-59, 2-88, 3-108, 4-114, 5-152
Did not bat: E Joyce, J Dalrymple, L Plunkett, S Mahmood, S Harmison
Toss: Sri Lanka
Result: Sri Lanka won by 2 runs
Man of the match: Sanath Jayasuriya (SRI)
Umpires: Nigel Llong (ENG), Ian Gould (ENG)
TV umpire: Peter Hartley (ENG)
Match referee: Clive Lloyd (WIS)