No sabes cómo trabajar con las transacciones.


El titular salió pegadizo, pero hirviendo. Debo decir de inmediato que hablaremos de 1C. Estimados sobrenombres 1C, no sabes cómo trabajar con las transacciones y no entiendes cuáles son las excepciones. Llegué a esta conclusión al observar una gran cantidad de código 1C, nacido en la naturaleza de la empresa nacional. En configuraciones típicas, esto es bastante bueno, pero la cantidad espantosa de código personalizado se escribe de manera incompetente en términos de trabajo con la base de datos. ¿Alguna vez has visto el error "Ya se han producido errores en esta transacción"? Si es así, entonces el título del artículo se aplica a usted. Veamos debajo del corte, finalmente, qué son las transacciones y cómo manejarlas correctamente cuando se trabaja con 1C.


¿Por qué necesitas hacer sonar la alarma?


Para comenzar, descubramos qué constituye el error "Ya se han producido errores en esta transacción". Esto, de hecho, es una cosa extremadamente simple: está tratando de trabajar con una base de datos dentro de una transacción ya bombeada (cancelada). Por ejemplo, se llamó al método Cancelar transacción en alguna parte y está intentando confirmarlo.


¿Por qué es esto malo? Debido a que este error no le dice nada sobre dónde ocurrió realmente el problema. Cuando una captura de pantalla con dicho texto llega al soporte del usuario, y especialmente para el código del servidor con el que las personas no interactúan interactivamente, esto ... quería escribir un "error crítico", pero pensé que era una palabra de moda a la que nadie le presta atención ... Este es un asno. Este es un error de programación. Esto no es una falla accidental. Esta es una jamba que debe rehacerse de inmediato. Porque cuando los procesos de su servidor en segundo plano se levantan por la noche y la compañía comienza a perder dinero rápidamente, entonces "Los errores ya han ocurrido en esta transacción" es lo último que desea ver en los registros de diagnóstico.


Existe, por supuesto, la posibilidad de que el registro tecnológico del servidor (está incluido en la producción, ¿verdad?) De alguna manera ayuda a diagnosticar el problema, pero ahora no puedo adivinar de inmediato cómo encontrar la razón real del error indicado en él. Pero la verdadera razón es una: el programador Vasya obtuvo una excepción dentro de la transacción y decidió que una vez - no karabas "piensa, error, sigamos adelante".


¿Qué son las transacciones en 1C?


Es vergonzoso escribir sobre verdades elementales, pero, aparentemente, un poco tendrá que hacerlo. Las transacciones en 1C son las mismas que las transacciones en un DBMS. Estas no son algunas transacciones especiales "1C", son transacciones en el DBMS. Según la idea general de las transacciones, pueden ejecutarse en su totalidad o no ejecutarse en absoluto. Todos los cambios realizados en las tablas de la base de datos dentro de una transacción se pueden deshacer de inmediato, como si no hubiera nada.


A continuación, debe comprender que 1C no admite transacciones anidadas. En realidad, no son compatibles no "en 1C", pero no son compatibles en absoluto. Al menos, esos DBMS con los que 1C puede trabajar. Las transacciones anidadas, por ejemplo, no están presentes en MS SQL y Postgres. Cada llamada "anidada" a Iniciar transacción simplemente aumenta el contador de transacciones, y cada llamada a "Confirmar transacción" disminuye este contador. Este comportamiento se describe en muchos libros y artículos, pero las conclusiones de este comportamiento, aparentemente, no se comprenden bien. Estrictamente hablando, en SQL hay un llamado SAVEPOINT, pero 1C no los usa, y la cosa es bastante específica.


En lo sucesivo, especialmente para Warriors of True Faith, que creen que el código debe escribirse solo en inglés, bajo los spoilers se les dará un análogo del código en la sintaxis inglesa 1C.


 ()

    ();

         
         = .();
        . = "    ";
        .();
    ;

    ();



, . , .


, ? . , . ? , . — . — deadlock, , , , . : deadlock .


, . 1- . , , 3 . , , 1 :)



, . 1 , "" "". , , :). , . , IT- .


, , ( ), . " ". , , . , . , , , ELK- 1 … (, , , :))


, , . , , ".()". ( ) , .



, .


, (, "()") . "" , , - -, . , : , , .



. 1 SonarQube . , 1, , …


? 90% . , 1 . , 1, .


:


 ()

      = ();
     ();


, . - , . — - . — … , ? "" , . , . , , , " -…"



"-" : . . , , , - , . .


:


 ()

      = ();
     ();

     ();

     //   ,         .


— . , ( — ) , . -, , .


, 3- . — .



. , , , .


1-


1 , . , . , :


 ()

    ();

         
         = .();

        . = "    ";
        
              .();
        
              .("    %1", );
              ;
        ;
    ;

    ();


, , ? , . . — , , " ", . , .


, 1- , , . , . "()" 1 , . 1 (, -), "" . , " ".


, , , - "" . , - . , , .


, , . . .


1


, 1 . :


  • ()
  • ()
  • ()
  • ()

3 , . — , .


. ( ) , . , , .


? : : , , .


? :


();
();
();

, — . - , "" . , :


();

    ();

    //     ?
;
();

, , ? ? , , . ? ? , . "" . - throw.


();

    ();

    ;
;
();

, … , ? : .


();

    ();

    ();
    ;
;
();

, , . , , (). , ? , , ? , , . , , . - .



, , "-" . :


**UPD: , . , -.


();

    ();
    ();

     () 
        ();
    ;
    ;
;

, "" . "" ""? , : , , . , . . . , . . . "" . , , , "" .


-


, .


:


();
();
();

"" , .


:


  () 
    ()

. , . . , . . .


:


 () 
    ()

: — . ? , - ? .


:


()
 .() 

    //    
    //  

;
();

  1. deadlock
  2. "",

:


()
 .() 

    
    .();
    
           ("  ");
    ;

;
();

. . , . .



, , , , , 1 . , , , Highload, , . ORM, GUI, -, Reporting, . , , — 1, — . , , , , , -, . 1 . 20 / -. , , . - 1 , , . - "()"....


— , . 1 - . , . " 1" — . .

Source: https://habr.com/ru/post/es419715/


All Articles