The name of your procedure is
CreditDeduct
but it actually sets a new balance which is provided using parameter.
In my opinion you should modify the procedure to
ALTER PROCEDURE dbo.CreditDeduct
@CardID numeric(18,0),
@deduction int
AS
UPDATE CreditCard SET balance = balance - @deduction WHERE CardID = @CardID
RETURN
This way the balance would always be set to a correct value based on the current situation of the balance. Now you have a risk that two programs read the balance and modify it based on "old" information about the balance. The problem itself is known as
lost update.
For more information, see
Concurrency control[
^]