¿Cómo maneja este tipo de solicitud un lenguaje de programación del lado del servidor?
La mayoría de los lenguajes de programación no se ocupan de esto. En cambio, este problema generalmente se resuelve mediante bases de datos, que están diseñadas para resolver este tipo de problemas mediante transacciones.
Ahora la pregunta cambia a, ¿cómo resuelven esto las bases de datos? Una variedad de formas, antiguas bases de datos relacionales usadas para bloquear registros de modo que solo una solicitud pueda modificar un valor particular al mismo tiempo. Las bases de datos relacionales modernas utilizaron una técnica llamada MVCC (control de concurrencia de múltiples versiones), que usó una estructura de datos basada en registros para permitir que varios lectores y escritores múltiples accedan al mismo registro de forma segura y concurrente, y para detectar y restaurar cuando hay conflictos de actualización. Algunas bases de datos distribuidas no relacionales eliminan el requisito de una consistencia estricta de los datos y, en cambio, permiten datos inconsistentes temporalmente, con una garantía "eventualmente consistente".
En el nivel más básico, la primitiva usaba una instrucción de CPU llamada comparar y cambiar. En un nivel superior, tiene una estructura de datos, un registro / diario de escritura anticipada, que realiza un seguimiento de los cambios en un archivo de solo anexo antes de que los cambios se incorporen a la estructura de datos actual. A nivel de infraestructura distribuida, tiene varios algoritmos de consenso como Paxos o Raft, y una serie de libros de contabilidad distribuidos especializados para garantizar una contabilidad coherente en múltiples máquinas.
Es probable que el contador de vistas de YouTube emplee una infraestructura distribuida con un contador "eventualmente consistente" en lugar de un contador totalmente consistente. Esto significa que, en cualquier momento, el contador de cada réplica puede que nunca refleje el conteo de la vista universal real, pero supuestamente, si el mundo deja de acceder a YouTube y se le da un poco de tiempo al sistema para alcanzar un estado estable, la infraestructura distribuida eventualmente convergen al recuento de vistas reales.
¿Pueden dos solicitudes acceder a una variable o cualquier tipo de datos y cambiar su valor al mismo tiempo? ¿Es la primera solicitud que se debe manejar primero y luego la segunda espera su turno?
Con las bases de datos que emplean bloqueos, sí, solo una solicitud puede acceder a una información a la vez, la solicitud que viene más tarde tuvo que esperar a que finalice la primera. Con las bases de datos que emplean MVCC, es posible manejar múltiples solicitudes al mismo tiempo, pero el conflicto de escritura se detecta y la solicitud que se realiza posteriormente se cancela. Con un contador distribuido y eventualmente coherente, son posibles múltiples escritores, pero se sacrifica una vista coherente de los datos.
Pregunta: ¿podría suceder solo por casualidad o el 100% del tiempo?
Ocurre todo el tiempo, no necesariamente el 100% del tiempo, pero a menudo es suficiente para que cuando una aplicación necesite escalar, tenga que tenerla en cuenta.
Pregunta: ¿Qué tipo de vulnerabilidad es esta? ¿Tiene una definición específica?
Cuando se maneja bien, no debería haber vulnerabilidad. Las aplicaciones deben definir el nivel de consistencia que la garantía necesita. Las aplicaciones financieras generalmente necesitan una garantía de coherencia sólida, mientras que el recuento de vistas de YouTube puede permitir una consistencia más flexible para un mayor rendimiento.