none
¿Control de concurrencia? RRS feed

  • Pregunta

  • Hola buenas:

    Tengo la siguiente duda de concepto: ¿Hay forma de controlar la concurrencia dependiendo de cómo estén declarados los contextos? Supongamos que estoy exponiendo a través de WCF usando estas dos formas de declaración.

    Código 1:

    public class ServicePrueba : IServicePrueba
        {
            public TESTERS GetUSUARIOS()
            {
                using (CONTROL_USUARIOSEntities entities = new CONTROL_USUARIOSEntities())
                {
                    TESTERS tester = entities.TESTERS.FirstOrDefault(t => t.INICIALES == "fdz");

                    return tester;
                }
            }
        }

    Código 2:

    public class ServicePrueba : IServicePrueba
        {
            private CONTROL_USUARIOSEntities entities = new CONTROL_USUARIOSEntities();

            public TESTERS GetUSUARIOS()
            {
                return entities.TESTERS.FirstOrDefault(t => t.INICIALES == "fdz");
            }
        }

    De la segunda forma, al haber sólo una inicialización de "entities" corriendo en el servicio, se controlaría la concurrencia de las peticiones desde distintos clientes. Si no es así, ¿sabéis de algún sitio donde pueda consultar?

    Muchas gracias de antemano y un saludo.

    David.

    martes, 21 de noviembre de 2017 9:42

Respuestas

  • La primera opción está claro que crea una instancia del dbContext por cada llamada al procedimiento, por lo que no tiene ningún problema de concurrencia desde este punto de vista.

    Pero la segunda opción depende de cómo esté configurado el servicio WCF:

    - Si el modo de instanciación lo tienes configurado como PerCall, entonces es equivalente el primer mecanismo, ya que se creará una instancia de la clase por cada llamada y en consecuenca la instancia del context será única por llamada.

    - Si el modo es PerSession, y el Binding utilizado permite el paso de la sesión, entonces se instancia una copia por cliente. Es equivalente al caso anterior si el cliente es mono-hilo, pero si el cliente puede hacer dos llamadas simultáneas al servidor, entonces puedes tener un problema de concurrencia porque el dbContext no es seguro en cuanto a multihilo. En un caso como este tendrías que habilitar o aplicar bloqueos en el lado servidor.

    - Y si el modo es SingleInstance, entonces se usa una única instancia de la clase, y tendrás problemas de concurrencia a no ser que uses bloquos para impedir que dos clientes accedan a la vez. Nótese que la configuración predeterminada de WCF aplica dicho bloqueo y no deja que dos clientes entren simultáneamente, por lo que no tendrás concurrencia mientras no cambies el modo para evitar dichos bloqueos predeterminados (en cuyo caso tendrías que añadir tú tus propios bloqueos en el código).

    https://www.codeproject.com/Articles/86007/ways-to-do-WCF-instance-management-Per-call-Per


    martes, 21 de noviembre de 2017 16:31

Todas las respuestas

  • La primera opción está claro que crea una instancia del dbContext por cada llamada al procedimiento, por lo que no tiene ningún problema de concurrencia desde este punto de vista.

    Pero la segunda opción depende de cómo esté configurado el servicio WCF:

    - Si el modo de instanciación lo tienes configurado como PerCall, entonces es equivalente el primer mecanismo, ya que se creará una instancia de la clase por cada llamada y en consecuenca la instancia del context será única por llamada.

    - Si el modo es PerSession, y el Binding utilizado permite el paso de la sesión, entonces se instancia una copia por cliente. Es equivalente al caso anterior si el cliente es mono-hilo, pero si el cliente puede hacer dos llamadas simultáneas al servidor, entonces puedes tener un problema de concurrencia porque el dbContext no es seguro en cuanto a multihilo. En un caso como este tendrías que habilitar o aplicar bloqueos en el lado servidor.

    - Y si el modo es SingleInstance, entonces se usa una única instancia de la clase, y tendrás problemas de concurrencia a no ser que uses bloquos para impedir que dos clientes accedan a la vez. Nótese que la configuración predeterminada de WCF aplica dicho bloqueo y no deja que dos clientes entren simultáneamente, por lo que no tendrás concurrencia mientras no cambies el modo para evitar dichos bloqueos predeterminados (en cuyo caso tendrías que añadir tú tus propios bloqueos en el código).

    https://www.codeproject.com/Articles/86007/ways-to-do-WCF-instance-management-Per-call-Per


    martes, 21 de noviembre de 2017 16:31
  • Muchísimas gracias por la respuesta Alberto. Me has sacado de dudas :). Un saludo.
    martes, 21 de noviembre de 2017 16:40