Red de conocimientos turísticos - Información de alquiler - Acerca de la escritura de transacciones en C#

Acerca de la escritura de transacciones en C#

Hay dos tipos de transacciones en .net: transacciones empresariales y transacciones de bases de datos. Las transacciones empresariales se encuentran en el espacio System.Enterprise, que se utiliza principalmente para esperar con interfaces de red externas. Crea instantáneas (muchas cosas son realmente irrecuperables), y la otra son las transacciones de bases de datos. El propietario utiliza transacciones de bases de datos. Estrictamente hablando, las transacciones de bases de datos no son .net. En realidad, es una forma empaquetada de transacciones de bases de datos reales. Por ejemplo, SqlTransaction trans = Conn.BeginTransction(); cuando se ejecuta, esta oración equivale a enviar una instrucción Begin trans a la base de datos. En este caso, la conexión (equivalente al alcance) no se permitirá durante este período de tiempo. Ejecutar otras declaraciones. En otras palabras, la conexión es exclusiva de la transacción y no se pueden ejecutar otros comandos hasta que trans realice una confirmación o reversión.

Si lo piensas desde otro ángulo, te resultará más fácil de entender: ¿conn.BeginTransction()? Después de esto, la conexión se considerará parte de la transacción hasta que la transacción se confirme o se revierta. SqlTransaction?trans?=?conn.BeginTransction();

prueba

{

SqlCommand?comm1?=?Conn.CreateCommand(sqlString);

p>

comm1.ExecuteNonQuery();

SqlCommand?comm2?=?new?SqlCommand(sqlString2,?conn)

comm2.ExecuteNonQuery() ;

/?Commit transacción

trans.Commit(); }catch {

trans.Rollback() }

Allí Son dos de las declaraciones anteriores sqlcomm, todas se ejecutan en la misma transacción. Estos dos comandos son equivalentes en ambas formas.

Hay dos puntos a tener en cuenta. La transacción de inicio debe realizarse en una conexión abierta. Si la conexión no se abre, se activará un error, es decir, la condición alternativa antes de la conexión. Se ejecuta la instrucción BeginTransction(). Sí, la conexión está abierta. Por lo tanto, si la transacción se puede abrir, ¡no es necesario realizar conn.open()! Por supuesto, esto no es culpa del propietario, la culpa del propietario se refleja en otro aspecto, es decir, el nuevo método SqlCommand (string sqltext, Connection conn, SqlTransction trans) no se utiliza de esta manera. Este método aparece en su código, que en realidad es new SqlCommand(string sqltext, Connection conn). Si conn está marcado en la transacción, el comando se completó como parte de la transacción cuando se ejecutó (cuando conn marca la transacción, no lo hace). existe Confirmación o reversión, todos los comandos ejecutados en la conexión son comandos de transacción, puede ver la explicación teórica encima del código, que será útil para su aprendizaje). Y el parámetro trans entrante se trata como otra transacción, en otras palabras, esta declaración se ejecuta en una de las transacciones (en la transacción marcada por la conexión), y al mismo tiempo debe ejecutarse en otra transacción (en la transacción entrante). trans), lo que da como resultado transacciones paralelas, y SQL no admite el paralelismo, por lo que recibe el mensaje de error "SqlCommand no admite transacciones paralelas".

Una vez conocido el motivo, es bastante sencillo modificarlo.

Pero esto parece funcionar para ti, pero de hecho, equivale a enseñar a la gente a pescar en lugar de enseñarles a pescar. Esto es solo una solución al problema, creo que no lo volverás a hacer, pero aun así, enseña. gente a pescar ¿No sería mejor enseñar a la gente a pescar?

Ha abierto el mensaje de error y el error en la parte de configuración usa mode="on", para que pueda ver el error. En términos generales, a muchas personas les duele la cabeza cuando ven esto, así que. Simplemente dale el error al "maestro" y pide ayuda. Entonces, ¿por qué no miras el error? ¿Por qué no mirar los errores usted mismo? Entonces, cuando vea algunos de los mensajes de este error, como "sqlcommand no permite que se ejecuten transacciones paralelas", sabrá la causa del error. Por supuesto, muchos principiantes no saben qué sucederá. , Excepto por el desbordamiento de 0, solo conocen una determinada operación. El valor del denominador es 0, nada más. Pero también es bastante difícil solucionar el problema y no necesariamente se utiliza una sola variable como divisor en un determinado bloque de funciones. ¿Cómo puedo localizar rápidamente el código?

El seguimiento de la pila juega un papel importante: no solo tiene la relación de llamada, sino también el número de líneas donde ocurrió el error. Su formato es el método (por supuesto, el nombre completo del método, espacio). nombre, nombre de clase, nombre de método) y espacios y número de línea después. En realidad, esta es una excepción al orden de burbuja. El nivel superior es la ubicación donde finalmente ocurre el error (número de línea del nombre del método). Debido a que ocurre, aparecerá hasta el método que lo llamó, que es directamente el último método o. intenta monitorear. El cuerpo del método. Si no está muy familiarizado con las bibliotecas de clases, puede encontrar la ubicación del código fuente donde ocurrió el error mirando de arriba a abajo para encontrar el primer método que escribió y luego mirando el número de línea correspondiente. Es posible que no comprenda por qué tantos métodos en la biblioteca de clases informan errores. De hecho, no es que haya un problema con la biblioteca de clases. La biblioteca de clases a la que llama simplemente establece algunos parámetros de su método de ejecución. Por lo tanto, los parámetros que pasó son inapropiados y no necesariamente son culpa de la biblioteca de clases.

Por ejemplo, el siguiente código

public?class?Defined.Math

{

public?static?int?Method1( int ?num1,?int?num2)

{return?num1/num2;)}

}

//Llamante

Definido .Math.Method1(12,0);

Obviamente, el error ocurrió en el lado de la persona que llama, y ​​el primer método cuando surgió la excepción fue la declaración en el método Método1, ¡no la declaración de la persona que llama!

Así es como se ve el burbujeo. Aunque en este caso, normalmente podemos encontrar el primer método que escribimos y modificarlo, pero debido al modo de desarrollo, es posible que la modificación no sea la primera declaración en aparecer. en el método.

Enséñele el método y luego analice brevemente por qué ocurre esta situación. Muchas personas desconocidas pensarán en modificar el Método1, por ejemplo: public?static?int?Method1(int?num1,?int?num2).

{

si(num2==0) ¿regresar?

¿regresar?¿Por qué? ¡La razón radica en el poderoso mecanismo de excepción de .net! Nunca pensaron en usar esta poderosa arma, simplemente acumularon código a ciegas y, a veces, el problema no es tan simple.

¿Qué pasa si se trata de un error de red o de IO? Como no saben cómo utilizar el mecanismo de excepción de .net, es posible que no hayan escrito un código como este: public?void?Method(int?num)

{

if( num= =0)

lanzar?nueva?Excepción();

/?¿Otro código?haciendo?algo;

}

¡Entonces .net tiene un poderoso mecanismo de excepción como arma, porque podemos crear clases que heredan de Exception para implementar excepciones personalizadas! Aquellos que ni siquiera saben cómo usar throw, naturalmente, no estarán expuestos a excepciones personalizadas. Entonces, al analizar la misma situación, es completamente posible que lancemos nuestra propia excepción, entonces, ¿cómo podemos modificarla? ¿Vas a modificar la declaración que arroja la excepción?

Por supuesto, di este ejemplo para ilustrar cómo localizar la posición incorrecta en el código fuente. La primera posición que aparece es simplemente la posición incorrecta, no la posición del código modificado. Ahora, ¿qué significa esto exactamente? Cuando miras la pila, puedes localizar el error directamente, no directamente en el primer método que escribiste y que arrojó la excepción.