How to insert and or update a variable number of records and prevent concurrency issues
If your goal is to ensure that at the end of procedure dbo.data contains only records you inserted in the body of procedure, then you move DELETE to the very end (I assume you have primary key in data table, data_id:

--DELETE FROM dbo.data WHERE user = @user  -- do it at the end    
DECLARE @captainsTable TABLE (captainId INT);
DECLARE @newData TABLE (data_id INT);
INSERT INTO @captainsTable (captainId)
SELECT DISTINCT TOP 3 item FROM [platform].[SimpleSplit](@captains, ',')

--store inserted rows into table
INSERT INTO dbo.data
( user ,
  player ,
  iscaptain
)
OUTPUT inserted.data_id INTO @newData
SELECT @user
     , item -- this is what is returned from the SimpleSplit
     , CASE WHEN [item] in (select captainId from @captainsTable) THEN 1
         ELSE 0
       END
  FROM [platform].[SimpleSplit](@captains, ',');
--delete all except recently inserted
DELETE b FROM dbo.data b WHERE user = @user AND NOT EXISTS
(SELECT NULL FROM @newData a WHERE a.data_id = b.data_id);


Also, it makes sense to begin transaction (or create a savepoint if the sp executed withing the context of existing transaction) in the beginning of procedure , and commit at the end.