Пока не придумал ничего лучше, чем блокирующую транзакцию
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
INSERT INTO messages (id,date,msg) VALUES(?,?,?)
SELECT id FROM messages ORDER BY date DESC LIMIT 1
COMMIT TRAN
И потом на уровне приложения проверить, что ID из последнего селекта равен ID переданому в инсерт.