Both select scope_identity and select @@identity return the identity column value of a newly inserted row. However, @@identity is not reliable because it works in a session level.
So, suppose stored procedure sp1 contains an insert statement, and after the insert statement, there is a call to another stored procedure, sp2.
Assume that sp2 also contains insert statement. Now at the end of sp1, retrieving sp2 not for sp1. But using select scope_identity() results in the identity column value for the insert statement in sp1.
This is why it’s always preferable to use select scope_identity() instead of select @@identity.