IIC2413 / Syllabus-2021-2

Contenido del curso Bases de datos del DCC PUC versión 2021-2
62 stars 44 forks source link

Consulta 2: cerrar la conexión con la base de datos en consultas individuales y en transacciones #265

Open cadaeic314 opened 3 years ago

cadaeic314 commented 3 years ago

Hola!, tengo una consulta acerca de las transacciones y como crear las conexiones, ya que el manejo de conexiones debería de ser distinto para una transacción y para consultas individuales. Por ejemplo, una consulta de este estilo

Distrito.create(nombre = 'Distrito 1')
Distrito.create(nombre = 'Distrito 2')
Distrito.create(nombre = 'Distrito 3')
Distrito.create(nombre = 'Distrito 4')

distrito_1 = Distrito.find(1)
distrito_1.update(nombre = 'Distrito 1 modificado')

distritos = Distrito.all()
for d in distritos:
    print(d.id, d.nombre)

Se me ocurre cerrar y abrir una conexión por cada método, pero esto chocaría con otra consulta como esta

with Model.transaction():
    Distrito.create(nombre='Distrito_1')
    Distrito.create(nombre='Distrito_2')
    Distrito.update(1, nombre='Distrito_1_modificado')
    distritos = Distrito.all()
    for distrito in distritos:
        print(distrito.nombre)

La cual al usar el primer método create ya perdería la conexión por que este la cierra. Entonces mi duda es, ¿hay que diferenciar cuando se trata de consultas en varias transacciones como el primer caso y en una sola transacción como el segundo?, ¿solo se harán consultas de un tipo?, ¿cómo se puede diferenciar un caso del otro?

Muchas gracias de antemano ❤️

ironcadiz commented 3 years ago

Tienes razón en que el primer caso de uso se puede lograr abriendo y cerrando conexiones con cada consulta, pero esto no es una buena práctica y no es el comportamiento que suele tener un ORM de mantiene una única (o varias) conexión global que es usada constantemente por la duración del programa. Aterrizándolo al control, si haces esa implementación efectivamente no podrás resolver la parte de las transacciones puesto que para eso se requiere que una secuencia arbitraria de consultas puedan ser ejecutadas en una misma conexión.

Entonces si entiendo tu pregunta, la respuesta es no, no tienes ni que diferenciar ni estaremos haciendo consultas de un solo tipo.

fernandosmither commented 3 years ago

Tienes razón en que el primer caso de uso se puede lograr abriendo y cerrando conexiones con cada consulta, pero esto no es una buena práctica y no es el comportamiento que suele tener un ORM de mantiene una única (o varias) conexión global que es usada constantemente por la duración del programa. Aterrizándolo al control, si haces esa implementación efectivamente no podrás resolver la parte de las transacciones puesto que para eso se requiere que una secuencia arbitraria de consultas puedan ser ejecutadas en una misma conexión.

Entonces si entiendo tu pregunta, la respuesta es no, no tienes ni que diferenciar ni estaremos haciendo consultas de un solo tipo.

Para concluir, entonces podemos asumir que el manejo de conexiones sólo se hace mediante las transacciones, y no se intentarán hacer operaciones "sueltas"?

ironcadiz commented 3 years ago

No, al revés . Model.transaction() solo debe iniciar y terminar una transacción en la db. No una conexión.

El ORM tiene que soportar hacer operaciones fuera de una transacción. Si no fuera así tendrían que implementar la parte 3 para poder hacer la parte 2.

Maxi1805 commented 3 years ago

Sobre lo que no debe iniciar una conexión, entonces si no podemos iniciar una conexión supongo que tampoco tiene que cerrarla, pero si no tenemos que abrirla y cerrarla por cada operación ¿Cómo sabemos en que momento debemos cerrar la conexión?

rjherrera commented 3 years ago

@Maxi1805 No hay que confundir ni mezclar transacciones con conexiones. Lo importante es tener claro que si manejan una conexión por operación no van a poder hacer bien la parte de las transacciones, porque esa parte requiere que haya una conexión para todas las operaciones contenidas en ella (si hay más de una es imposible hacer una transacción "inter-conexiones").

No hay restricciones per se sobre cómo manejar las conexiones, el tema viene con que no van a poder hacer una transacción si cada operación dentro de la misma abre una nueva conexión. La transacción no haría su pega.

Para terminar de aclarar: