P. 1
Transacciones en SQL

Transacciones en SQL

4.8

|Views: 6.324|Likes:
Publicado por16460596

More info:

Published by: 16460596 on Jan 02, 2009
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC or read online from Scribd
See more
See less

01/14/2014

Transacciones en SQL Server

Autor: Cesar Manivesa (manivesa) 1 . Introducción 2 . Sentencias para una transacción 3 . Transacciones anidadas 4 . Un par de ejemplos m s ! . Transacciones " procedimientos almacenados.

Transacciones en S#$ Server %ntre las &a'ilidades de todo Sistema (estor de )ases de *atos +elaciones tiene ,ue estar la de permitir al pro-ramador crear transacciones. . aun,ue el S#$ Server nos permite tra'ajar con transacciones de manera sencilla " e/ica0 siempre &a" di/icultades...

Introducción
Una transacción es un conjunto de operaciones ,ue van a ser tratadas como una 1nica unidad. %stas transacciones de'en cumplir 4 propiedades /undamentales com1nmente conocidas como 2CI* (atomicidad3 co&erencia3 asilamiento " dura'ilidad). $a transacción m s simple en S#$ Server es una 1nica sentencia S#$. 4or ejemplo una sentencia como esta5
UPDATE Products SET UnitPrice=20 WHERE ProductName ='Chai'

%s una transacción. (Como siempre ejemplos de 6ort&7ind) %sta es una transacción 8autocommit83 una transacción autocompletada. Cuando enviamos esta sentencia al S#$ Server se escri'e en el /ic&ero de transacciones lo ,ue va a ocurrir " a continuación reali0a los cam'ios necesarios en la 'ase de datos. Si &a" al-1n tipo de pro'lema al &acer esta operación el S#$ Server puede leer en el /ic&ero de transacciones lo ,ue se esta'a &aciendo " si es necesario puede devolver la 'ase de datos al estado en el ,ue se encontra'a antes de reci'ir la sentencia. 4or supuesto este tipo de transacciones no re,uieren de nuestra intervención puesto ,ue el sistema se encar-a de todo. Sin em'ar-o si &a" ,ue reali0ar varias operaciones " ,ueremos ,ue sean tratadas como una unidad tenemos ,ue crear esas transacciones de manera e9pl:cita.

Sentencias para una transacción

Como dec:amos una transacción es un conjunto de operaciones tratadas como una sola. %ste conjunto de operaciones de'e marcarse como transacción para ,ue todas las operaciones ,ue la con/orman ten-an ;9ito o todas /racasen. $a sentencia ,ue se utili0a para indicar el comien0o de una transacción es 8)%(I6 T+268. Si al-una de las operaciones de una transacción /alla &a" ,ue des&acer la transacción en su totalidad para volver al estado inicial en el ,ue esta'a la 'ase de datos antes de empe0ar. %sto se consi-ue con la sentencia 8+<$$)2C= T+268. Si todas las operaciones de una transacción se completan con ;9ito &a" ,ue marcar el /in de una transacción para ,ue la 'ase de datos vuelva a estar en un estado consistente con la sentencia 8C<MMIT T+268.

Un ejemplo
Tra'ajaremos con la 'ase de datos 6ort&7ind en nuestros ejemplos. >amos a reali0ar una transacción ,ue modi/ica el precio de dos productos de la 'ase de datos.
USE NorthWind DECLARE Error int !!Dec"aramos una #aria$"e %ue uti"i&aremos 'ara a"macenar un 'osi$"e c(di)o de error *E+,N TRAN !!,niciamos "a transacci(n UPDATE Products SET UnitPrice=20 WHERE ProductName ='Chai' !!E-ecutamos "a 'rimera sentencia SET Error= ERR.R !!Si ocurre un error a"macenamos su c(di)o en Error !!/ sa"tamos a" tro&o de c(di)o %ue deshara "a transacci(n0 Si1 eso de ah2 es un !!+.T.1 e" demonio de "os 'ro)ramadores1 'ero no 'asa nada 'or usar"o !!cuando es necesario ,3 4 Error5607 +.T. TratarError !!Si "a 'rimera sentencia se e-ecuta con 89ito1 'asamos a "a se)unda UPDATE Products SET UnitPrice=20 WHERE ProductName='Chan)' SET Error= ERR.R !!: si ha/ un error hacemos como antes ,3 4 Error5607 +.T. TratarError !!Si ""e)amos hasta a%u2 es %ue "os dos UPDATE se han com'"etado con !!89ito / 'odemos ;)uardar; "a transacci(n en "a $ase de datos C.<<,T TRAN TratarError= !!Si ha ocurrido a")>n error ""e)amos hasta a%u2 ,? Error560 THEN *E+,N PR,NT 'Ha ecorrido un error0 A$ortamos "a transacci(n' !!Se "o comunicamos a" usuario / deshacemos "a transacci(n !!todo #o"#er@ a estar como si nada hu$iera ocurrido R.LL*ACA TRAN END

Como se puede ver para cada sentencia ,ue se ejecuta miramos si se &a producido o no un error3 " si detectamos un error ejecutamos el 'lo,ue de códi-o ,ue des&ace la transacción. ?a" una interpretación incorrecta en cuanto al /uncionamiento de las transacciones ,ue esta 'astante e9tendida. Muc&a -ente cree ,ue si tenemos varias sentencias dentro de una transacción " una de ellas /alla3 la transacción se a'orta en su totalidad. @6ada m s lejos de la realidadA Si tenemos dos sentencias dentro de una transacción.
USE NorthWind *E+,N TRAN UPDATE Products SET UnitPrice=20 WHERE ProductName='Chan)' UPDATE Products SET UnitPrice=20 WHERE ProductName='Chan)' C.<<,T TRAN

%stas dos sentencias se ejecutar n como una sola. Si por ejemplo en medio de la transacción (despu;s del primer update " antes del se-undo) &a" un corte de electricidad3 cuando el S#$ Server se recupere se encontrar en medio de una transacción "3 o 'ien la termina o 'ien la des&ace3 pero no se ,uedar a medias. %l error est en pensar ,ue si la ejecución de la primera sentencia da un error se cancelar la transacción. %l S#$ Server sólo se preocupa de ejecutar las sentencias3 no de averi-uar si lo &acen correctamente o si la ló-ica de la transacción es correcta. %so es cosa nuestra. 4or eso en el ejemplo ,ue tenemos m s arri'a para cada sentencia de nuestro conjunto averi-uamos si se &a producido un error " si es as: actuamos en consecuencia cancelando toda la operación.

Transacciones anidadas
<tra de las posi'ilidades ,ue nos o/rece el S#$ Server es utili0ar transacciones anidadas. %sto ,uiere decir ,ue podemos tener transacciones dentro de transacciones3 es decir3 podemos empe0ar una nueva transacción sin &a'er terminado la anterior. 2sociada a esta idea de anidamiento e9iste una varia'le -lo'al BBT+26C<U6T ,ue tiene valor C si no e9iste nin-1n nivel de anidamiento3 1 si &a" una transacción anidada3 2 si estamos en el se-undo nivel de anidamiento. " as: sucesivamente. $a di/icultad de tra'ajar con transacciones anidadas est en el comportamiento ,ue tienen a&ora las sentencias 8C<MMIT T+268 " 8+<$$)2C= T+268

ROLLBACK TRAN: *entro de una transacción anidada esta sentencia des&ace todas las transacciones internas &asta la instrucción )%(I6 T+26S2CTI<6 m s e9terna. COMMIT TRAN: *entro de una transacción anidada esta sentencia 1nicamente reduce en 1 el valor de BBT+26C<U6T3 pero no D/inali0aD nin-una transacción ni D-uardaD los cam'ios. %n el caso en el ,ue BBT+26C<U6TE1 (cuando estamos en la 1ltima transacción) C<MMIT

T+26 &ace ,ue todas las modi/icaciones e/ectuadas so're los datos desde el inicio de la transacción sean parte permanente de la 'ase de datos3 li'era los recursos mantenidos por la cone9ión " reduce BBT+26C<U6T a C. Como siempre un ejemplo es lo mejor para entender como /unciona.
CREATE TA*LE Test 4Co"umna int7 +. *E+,N TRAN TranE9terna !! TRANC.UNT ahora es B SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT ,NSERT ,NT. Test CALUES 4B7 *E+,N TRAN Tran,nternaB !! TRANC.UNT ahora es 20 SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT ,NSERT ,NT. Test CALUES 427 *E+,N TRAN Tran,nterna2 !! TRANC.UNT ahora es D0 SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT ,NSERT ,NT. Test CALUES 4D7 C.<<,T TRAN Tran,nterna2 !! Reduce TRANC.UNT a 20 !! Pero no se )uarda nada en "a $ase de datos0 SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT C.<<,T TRAN Tran,nternaB !! Reduce TRANC.UNT a B0 !! Pero no se )uarda nada en "a $ase de datos0 SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT C.<<,T TRAN TranE9terna !! Reduce TRANC.UNT a 00 !! Se ""e#a a ca$o "a transacci(n e9terna / todo "o %ue con""e#a0 SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT SELECT E 3R.< Test

4or cierto ,ue lo de usar nom're para las transacciones es por claridad3 puesto ,ue C<MMIT T+26 como "a &emos dic&o solamente reduce en 1 el valor de BBT+26C<U6T. >eamos a&ora un ejemplo de transacción anidada con +<$$)2C= T+26
*E+,N TRAN TranE9terna !! TRANC.UNT ahora es B SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT ,NSERT ,NT. Test CALUES 4B7 *E+,N TRAN Tran,nternaB !! TRANC.UNT ahora es 20 SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT ,NSERT ,NT. Test CALUES 427 *E+,N TRAN Tran,nterna2 !! TRANC.UNT ahora es D0 SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT ,NSERT ,NT. Test CALUES 4D7 R.LL*ACA TRAN !! TRANC.UNT es 0 / se deshace !!"a transacci(n e9terna / todas "as internas SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT SELECT E 3R.< Test

%n este caso no se inserta nada puesto ,ue el +<$$)2C= T+26 des&ace todas las transacciones dentro de nuestro anidamiento &asta la transacción m s e9terna " adem s &ace BBT+26C<U6TEC FSupone este /uncionamiento asim;trico del C<MMIT " del +<$$)2C= un pro'lemaG 4ues la verdad es ,ue no. $a manera de tratar las transacciones por el S#$ Server es la ,ue nos permite pro-ramar de manera natural los anidamientos. *e todos

modos3 si ,ueremos ir un poco m s lejos &a" una cuarta sentencia para tra'ajar con transacciones5 S2>% T+26 Sa e Tran %sta sentencia crea un punto de almacenamiento dentro de una transacción. %sta marca sirve para des&acer una transacción en curso sólo &asta ese punto. 4or supuesto nuestra transacción de'e continuar " terminar con un C<MMI6 T+26 (o los ,ue &a-an /alta) para ,ue todo se -uarde o con un +<$$)2C= T+26 para volver al estado previo al primer )%(I6 T+26.
*E+,N TRAN TranE9terna !! TRANC.UNT ahora es B SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT ,NSERT ,NT. Test CALUES 4B7 *E+,N TRAN Tran,nternaB !! TRANC.UNT ahora es 20 SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT ,NSERT ,NT. Test CALUES 427 SACE TRAN +uadada *E+,N TRAN Tran,nterna2 !! TRANC.UNT ahora es D0 SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT ,NSERT ,NT. Test CALUES 4D7 R.LL*ACA TRAN +uadada !! se deshace "o hecho e" 'unto )uardado0 SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT !!Ahora 'odemos decidir si "a transacci(n se ""e#a a ca$o !!o se deshace com'"etamente !!Para deshacer"a un R.LL*ACA $astar@ como hemos #isto !!Pero 'ara )uardar "a transacci(n hace ?a"ta reducir TRANC.UNT a 0 C.<<,T TRAN Tran,nternaB !! Reduce TRANC.UNT a 20 SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT C.<<,T TRAN Tran,nternaB !! Reduce TRANC.UNT a B0 !! Pero no se )uarda nada en "a $ase de datos0 SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT C.<<,T TRAN TranE9terna !! Reduce TRANC.UNT a 00 !! Se ""e#a a ca$o "a transacci(n e9terna / todo "o %ue con""e#a0 SELECT 'E" ni#e" de anidamiento es'1 TRANC.UNT SELECT E 3R.< Test

Si no ponemos el nom're del punto salvado con S2>% T+26 al &acer un +<$$)2C= T+26 se des&ace la transacción m s e9terna " BBT+26C<U6T se pone a C. Como podemos ver el uso de transacciones no es complicado3 e incluso las transacciones anidadas si se tratan con cuidado son / ciles de manejar.

Un par de ejemplos m!s
>eamos otro par de ejemplos para dejar claro como /uncionan las sentencias )%(I63 C<MMIT " S2>%
*E+,N TRAN !! Primer *E+,N TRAN / ahora TRANC.UNT = B *E+,N TRAN !! Ahora TRANC.UNT = 2 C.<<,T TRAN

cam$ios C.<<,T TRAN !! Por ?in TRANC.UNT = 0 !! Si hu$iera cam$ios 'endientes se ""e#an a "a $ase de datos !! : #o"#emos a un estado norma" con "a transacci(n aca$ada

!! Co"#emos a TRANC.UNT = B !! Pero no se )uarda nada ni se hacen e?ecti#os "os 'osi$"es

Uso del C<MMIT
*E+,N TRAN !! Primer *E+,N TRAN / TRANC.UNT = B *E+,N TRAN !! Ahora TRANC.UNT = 2 C.<<,T TRAN !! Como antes TRANC.UNT = B !!: como antes nada se )uarda R.LL*ACA TRAN !! Se cance"a T.DA "a transacci(n0 Recordemos %ue e" C.<<,T !! de antes no )uardo nada1 so"o redu-o TRANC.UNT !! Ahora TRANC.UNT = 0 C.<<,T TRAN !! No #a"e 'ara nada 'or%ue TRANC.UNT es 0 'or e" e?ecto de" R.LL*ACA

Uso del +<$$)2C= %n cuanto al S2>% T+26 podemos recordarlo con el si-uiente ejemplo5
CREATE TA*LE Ta$"aB 4Co"umnaB #archar4F077 +. *E+,N TRAN ,NSERT ,NT. Ta$"aB CALUES 4'Primer #a"or'7 SACE TRAN PuntoB ,NSERT ,NT. Ta$"aB CALUES 4'Se)undo #a"or'7 R.LL*ACA TRAN PuntoB ,NSERT ,NT. Ta$"aB CALUES 4'Tercer #a"or'7 C.<<,T TRAN SELECT E 3R.< Ta$"aB Co"umnaB !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Primer #a"or Tercer #a"or 42 ?i"as a?ectadas7

Un +<$$)2C= a un S2>% T+26 no des&ace la transacción en curso ni modi/ica BBT+26C<U6T3 simplemente cancela lo ocurrido desde el 8S2>% T+26 nom're8 &asta su 8+<$$)2C= T+26 nom're8

Transacciones " procedimientos almacenados#
Cuando tra'ajamos con procedimientos almacenados de'emos recordar ,ue cada procedimiento almacenado es una unidad. Cuando se ejecuta lo &ace de manera independiente de ,uien lo llama. Sin em'ar-o si tenemos un +<$$)2C= T+26

dentro de un procedimiento almacenado cancelaremos la transacción en curso3 pero si &a" una transacción e9terna al procedimiento en el ,ue estamos tra'ajando se cancelar esa transacción e9terna. Con esto no ,uiero decir ,ue no se pueda usar3 simplemente ,ue &a" ,ue tener mu" claras las 4 normas so're las sentencias )%(I63 +<$$)2C= " C<MMIT ,ue comentamos al principio de este art:culo. >eamos como se comporta una transacción en un procedimiento almacenado llamado desde una transacción.
CREATE PR.CEDURE ,nserta2 AS *E+,N TRAN !!Uno ,NSERT ,NT. Ta$"aB CALUES 4'Ca"or2'7 R.LL*ACA TRAN !!Uno +. CREATE PR.CEDURE ,nsertaB AS *E+,N TRAN !!Dos ,NSERT ,NT. Ta$"aB CALUES 4'Ca"or B'7 EGEC ,nserta2 ,NSERT ,NT. Ta$"aB CALUES 4'Ca"orD'7 C.<<,T TRAN !!Dos +.

%n principio parece ,ue si ejecutamos el procedimiento 8Inserta18 el resultado ser:a5
EGECUTE insertaB SELECT E 3R.< ta$"aB t9t !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Ca"orB Ca"orD 42 ?i"as a?ectadas7

4ero lo ,ue o'tenemos es5
EGECUTE insertaB SELECT E 3R.< ta$"aB 4B ?i"as a?ectadas7 4B ?i"as a?ectadas7 Ser#idor= mensa-e 2HH1 ni#e" BH1 estado 21 'rocedimiento ,nserta21 "2nea I E" recuento de transacciones des'u8s de EGECUTE indica %ue ?a"ta una instrucci(n C.<<,T o R.LL*ACA TRANSACT,.N0 Recuento anterior = B1 recuento actua" = 00 4B ?i"as a?ectadas7 Ser#idor= mensa-e DJ021 ni#e" BH1 estado B1 'rocedimiento ,nsertaB1 "2nea I La 'etici(n C.<<,T TRANSACT,.N no tiene "a corres'ondiente *E+,N TRANSACT,.N0 t9t !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Ca"orD 4B ?i"as a?ectadas7

Si anali0amos estos mensajes vemos ,ue se inserta la primera /ila3 se salta al se-undo procedimiento almacenado " se inserta la se-unda /ila. Se ejecuta el 8+<$$)2C= T+26 H*os8 del se-undo procedimiento almacenado " se des&acen las dos inserciones por,ue este +<$$)2C= cancela la transacción e9terior3 la del primer procedimiento almacenado. 2 continuación se termina el se-undo procedimiento almacenado " como este procedimiento tiene un 8)%(I6 T+26 H*os8 " no tiene un C<MMIT o un +<$$)2C= (recordemos ,ue el 8+<$$)2C= T+26 H*os8 termina el 8)%(I6 T+26 HUno8) se produce un error " nos avisa ,ue el procedimiento almacenado termina con una transacción pendiente. 2l volver al procedimiento almacenado e9terno se ejecuta el I6S%+T ,ue inserta la tercera /ila " a continuación el 8C<MMIT T+26 HHUno8. 2,u: aparece otro error puesto ,ue este 8C<MMIT T+26 HUno8 esta'a a&: para /inali0ar una transacción ,ue "a &a sido cancelada anteriormente.

$l modo correcto
4ara ,ue nuestras transacciones se comporten como se espera dentro de un procedimiento almacenado podemos recurrir al S2>% T+26. >eamos como5
CREATE PR.CEDURE ,nserta2 AS SACE TRAN +uardado ,NSERT ,NT. Ta$"aB CALUES 4'Ca"or2'7 R.LL*ACA TRAN +uardado +. CREATE PR.CEDURE ,nsertaB AS *E+,N TRAN ,NSERT ,NT. Ta$"aB CALUES 4'Ca"or B'7 EGEC ,nserta2 ,NSERT ,NT. Ta$"aB CALUES 4'Ca"or D'7 C.<<,T TRAN +.

2&ora el 8+<$$)2C= T+26 -uardado8 del se-undo procedimiento almacenado des&ace la transacción sólo &asta el punto -uardado. 2dem s este +<$$)2C= no decrementa el BBT+26C<U6T ni a/ecta a las transacciones en curso. %l resultado o'tenido al ejecutar este procedimiento almacenado es5
EGECUTE insertaB SELECT E 3R.< ta$"aB 4B ?i"as a?ectadas7 4B ?i"as a?ectadas7 4B ?i"as a?ectadas7 t9t !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Ca"or B Ca"or D 42 ?i"as a?ectadas7

Una ve0 vistos estos ejemplos ,ueda claro ,ue no &a" pro'lema en utili0ar transacciones dentro de procedimientos almacenados siempre ,ue ten-amos en cuenta el comportamiento del +<$$)2C= T+26 " ,ue utilicemos el S2>% T+26 de manera adecuada. %ara mas in&ormación so're transacciones: • M s in/ormación en MIC+<S<IT &ttp5JJmsdn.microso/t.comJli'rar"Jde/ault.aspGurlEJli'rar"JenH usJacdataJacKLKmdKCMK2it2.asp • %n S#$T%2M podemos encontrar &ttp5JJ777.s,lteam.comJitem.aspG ItemI*E1!!L3 • %n C<*%4+<N%CT tenemos &ttp5JJ777.codeproject.comJdata'aseJs,lservertransactions.asp • . en *<T6%TNU6=I%S &ttp5JJdotnetjunOies.comJPe'$o-Jdarrell.nortonJarc&iveJ2CC3J12J24J4Q21.asp9

(ltimos comentarios (ltimos ) comentarios
Script *++,--,+../0
4or jarold ?ola3 al-uien puede a"udarmeGG3 como *)2 sur-e siempre la tarea de iniciali0ar 'ases de atos con cat lo-os prede/inidos " otras ta'las vacias3 por lo ,ue necesito un script o una tool para poder insertar re-istros varios en diversas ta'las3 ojala me pueda al-uien a"udar.(racias.

Manejo de TRansacciones *1.,.2,+../0
4or %d-ar Curiel Ten-o un Sp ,ue aplica movimientos de empleados3 todo lo ten-o dentro de una transaccion3 "a ,ue implica movimientos de sueldos3 so'resueldos3 prestamos3 vacaciones3 etc. 4ara cada movimiento inserto un re-istro en la 'itacora3 para sa'er cual es el estatus de mi movimiento cuando lo monitoreo. Cuando 2l-o sale mal3 apliOa roll'acO a todo3 inclu"endo mis re-istros de 'itacora. 4re-unta... Como le puedo &acer para Oe el +oll)acO no 2/ecte mi )itacora " si re-rese los movimientos de los empleadosGGG %s un Sp de casi 3!CC $ineas3 por eso me interesa mantener mi 'itacora viva3 para detectar en Oe movimiento /ue donde trono. %spero una respuesta pronta. Saludos.

Insertar Re3istros en Serie *-+,-+,+..40
4or &enr" ten-o una ta'la con 2R re-istros pero deseo incrementar a 3CC para &acer pru'as como puede &acer empleando un script de s,l in-resarle re-istros en serie " evitarme estar in-resando 1 9 1 desde la aplicación

Respuesta para Mario *+5,--,+..40
4or NulianT Mario3 a,ui van unas 'reves respuestas so're tus pre-untas5 1. Creo ,ue estas con/undiendo un transaccion en un motor con una /uncion en un len-uaje de pro-ramacion3 una transaccion es in&erente al motor de 'ases de datos " simplemente lo ,ue &ace es ejecutar una serie de instrucciones S#$ como un solo conjunto de tal manera ,ue se pueda posteriormente SDdes&acerSD los cam'ios ,ue se &a"an podido &acer o -uardarlos de/initivamente. >iendolo de un modo sencillo es como una utilidad ,ue nos permite SDdes&acerSD si al-o no sale 'ien. 2. Se-un la de/inicion anterior3 a las transacciones no se les puede pasar parametros como a las /unciones3 lo ,ue se puede &acer es de/inir una /uncion con los parametros ,ue ,uieras e invocarla dentro de una transaccion. 3. *entro de una transaccion SI se pueden llamar procedimientos almacenados pero teniendo en cuenta las indicaciones del tutorial. 4. %so lo puedes reali0ar con una /uncion so're el motor3 esta /uncion reci'iria como parametros los elementos del arra" " los insertaria en la ta'la ,ue ,uieras. . puedes usar una transaccion para llamar la /uncion si deseas.

Usar mas Nort67ind *-1,-.,+..40
4or Nose $uis 4odrian poner mas ejemplos de transacciones " procedimientos almacenados so're la )* 6ort&7ind

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->