Faf du Plessis and David Miller both made centuries as South Africa recovered from a poor start to hammer Sri Lanka by 121 runs and take a 2-0 lead in the one-day series.
The Proteas had won the opener by eight wickets but were struggling in the early stages at Kingsmead on Wednesday having been put in by the tourists.
Du Plessis and Miller came together at 108-4 in the 20th over, but a stand of 117 steadied the innings and set a platform for the hosts to make 307-6.
Miller was left 117 not out at the end, made from 98 balls including three fours and six sixes, while Du Plessis was more circumspect in his 105 from 120 deliveries.
Sri Lanka were up with the required rate in the early stages of their reply, but their chase was undermined by the regular loss of wickets, with Dinesh Chandimal's 36 from 46 representing their best effort as they crumbled to 186 all out.
In the end it was a more than convincing win for South Africa, but things did not look so rosy early on with Hashim Amla, Quinton de Kock, captain AB de Villiers and JP Duminy all back in the hutch cheaply.
Du Plessis was dropped at slip when on 63, and he punished Sri Lanka with his seventh ODI century, brought up with a back-foot drive through cover.
He soon holed out off Nuwan Kulasekara (1-76) and Miller took centre stage, helping his side plunder 78 runs from the final seven overs.
Sri Lanka openers Niroshan Dickwella (25) and skipper Upul Tharanga (26) made a bright start, but the former perished to a stunning one-handed catch by Du Plessis at cover and his downfall set the tone for an innings that never gained any momentum.
That opening stand of 45 proved the best of the reply, Kusal Mendis (20), Asela Gunaratne (18) and Chandimal continuing the trend of Sri Lanka batsmen failing to build on a start.
All six bowlers used by De Villiers picked up at least one wicket - Imran Tahir the pick with 2-26 from 8.5 - and the Proteas can wrap up the five-match series with victory at the Wanderers on Saturday.