Aquí están las respuestas correctas, y sus respectivas explicaciones, al artículo: Más preguntas sobre transacciones (3)

Así que veamos que tal te fue:

Pregunta 1. ¿Dentro de un stored procedure se puede escribir un COMMIT?

[Sí]     [No]     [Sí, en un EXECUTE STATEMENT]

La respuesta es Sí, en un EXECUTE STATEMENT. Pero el hecho de que pueda hacerse no significa que deba hacerse, es una posibilidad que tenemos pero debemos pensar muy bien antes de emplearla.

Pregunta 2. ¿Dentro de un trigger se puede escribir un COMMIT?

[Si]     [No]     [Sí, en un EXECUTE STATEMENT]

La respuesta es Sí, en un EXECUTE STATEMENT. Misma respuesta que en la Pregunta 1.

Pregunta 3. ¿Las instrucciones dentro de un IN AUTONOMOUS TRANSACTION DO requieren que la transacción finalice con un COMMIT para confirmarse?

[Sí]     [No]     [A veces]

La respuesta es No. Como su nombre lo indica se trata de una transacción autónoma que siempre finaliza automáticamente con un COMMIT.

Por lo tanto, todo lo que escribamos dentro de IN AUTONOMOUS TRANSACTION DO siempre estará confirmado.

Pregunta 4. ¿Se puede crear una tabla dentro de un stored procedure?

[Sí]     [No]     [Sí, si se usa EXECUTE STATEMENT]

La respuesta es Sí, si se usa EXECUTE STATEMENT. Pero mucho cuidado, el hecho de que pueda hacerse no significa que deba hacerse. Si creas un tabla dentro de un stored procedure el Firebird solamente podrá comprobar que su estructura es correcta cuando se ejecute ese stored procedure. Eso significa que podrías haber escrito el nombre de un dominio inexistente o cualquier otro error y será detectado recién cuando el stored procedure sea ejecutado…quizás por un usuario de muy pocas pulgas.

Pregunta 5. Si una transacción solamente hizo un SELECT. ¿Es preferible que esa transacción finalice con un COMMIT o con un ROLLBACK?

[Con un COMMIT]     [Con un ROLLBACK]     [Es indiferente]

La respuesta es Con un COMMIT. ¿Por qué? Porque el resultado final será el mismo si finalizas esa transacción con un COMMIT o con un ROLLBACK, pero el COMMIT es más rápido que el ROLLBACK y por lo tanto lo preferible es que finalices esa transacción con un COMMIT.

Como la transacción solamente hizo un SELECT, no dejó basura en la Base de Datos, pero el COMMIT es más rápido que el ROLLBACK.

Pregunta 6. ¿Una transacción puede saber lo que las otras transacciones están haciendo?

[Sí]     [No]     [A veces]

La respuesta es No. Jamás en Firebird una transacción puede saber lo que las otras transacciones están haciendo, solamente puede saber:

  • Lo que hicieron las transacciones que finalizaron con un COMMIT antes de que ella empezara
  • Si su aislamiento es READ COMMITED, lo que hicieron las transacciones que ya finalizaron con un COMMIT (aunque hubieran empezado después que ella)
  • Lo que ella misma ha hecho

Firebird cumple al 100% con ACID y por lo tanto cada transacción está totalmente aislada de las demás transacciones, nunca una transacción podría saber lo que las demás transacciones están haciendo, solamente puede  saber lo que otras transacciones que ya finalizaron con un COMMIT hicieron.

Artículos relacionados:

Más preguntas sobre transacciones (3)

Creando tablas dentro de un stored procedure o de un trigger

Crear una tabla e insertarle filas DENTRO de un stored procedure

Terminar las transacciones de los SELECTs

El índice del blog Firebird21

El foro del blog Firebird21

00