If your inside the same transaction then you should see the updated value.
Try the following test
CREATE TABLE TableA (
ColA nvarchar(100)
);
INSERT INTO TableA VALUES ('Empty');
CREATE PROCEDURE ProcB AS
DECLARE
@currentvalue nvarchar(100);
BEGIN
SELECT @currentvalue = ColA FROM TableA;
PRINT 'ProcB: ' + @currentvalue + ', trancount: ' + CAST(@@trancount AS nvarchar(10));
END;
CREATE PROCEDURE ProcA AS
DECLARE
@currentvalue nvarchar(100);
BEGIN
BEGIN TRANSACTION;
UPDATE TableA SET colA = 'Updated';
EXEC ProcB
ROLLBACK;
SELECT @currentvalue = ColA FROM TableA;
PRINT 'ProcA: ' + @currentvalue + ', trancount: ' + CAST(@@trancount AS nvarchar(10));
END;
EXEC ProcA
The result should be
(1 row(s) affected)
ProcB: Updated, trancount: 1
ProcA: Empty, trancount: 0
So based on this the problem lies elsewhere. Check for example:
- Are you really inside the same transaction, for example no linked server involved
- Did the UPDATE statement actually update any rows, is the modification done
- If WHERE clause is involved, do you have the same conditions etc...
Where applicable print the intermediate results and/or conditions to ensure that the code path is executed as expected.