Anda tidak tahu cara bekerja dengan transaksi


Judulnya menarik, tetapi mendidih. Saya harus mengatakan segera bahwa kita akan berbicara tentang 1C. Nama panggilan 1C yang terhormat, Anda tidak tahu cara bekerja dengan transaksi dan tidak mengerti apa pengecualiannya. Saya sampai pada kesimpulan ini dengan melihat sejumlah besar kode 1C, lahir di belantara perusahaan domestik. Dalam konfigurasi tipikal, ini cukup bagus, tetapi jumlah kode kustom yang mengerikan ditulis tidak kompeten dalam hal bekerja dengan database. Pernahkah Anda melihat kesalahan "Kesalahan telah terjadi dalam transaksi ini"? Jika demikian, maka judul artikel berlaku untuk Anda. Mari kita lihat di bawah potongan, akhirnya, apa transaksi dan bagaimana menanganinya dengan benar ketika bekerja dengan 1C.


Mengapa Anda perlu membunyikan alarm


Untuk memulainya, mari cari tahu apa yang merupakan kesalahan "Kesalahan telah terjadi dalam transaksi ini." Ini, sebenarnya, adalah hal yang sangat sederhana: Anda mencoba bekerja dengan database di dalam transaksi yang sudah dipompa (dibatalkan). Misalnya, metode Batalkan Transaksi dipanggil di suatu tempat, dan Anda mencoba untuk melakukannya.


Kenapa ini buruk? Karena kesalahan ini tidak memberi tahu Anda apa pun di mana masalah sebenarnya terjadi. Ketika tangkapan layar dengan teks seperti itu datang ke dukungan dari pengguna, dan terutama untuk kode server yang orang tidak berinteraksi dengan secara interaktif, ini ... Saya ingin menulis "kesalahan kritis", tetapi mengira itu adalah kata kunci yang tidak ada yang memperhatikan .... Ini keledai. Ini adalah kesalahan pemrograman. Ini bukan kegagalan yang tidak disengaja. Ini adalah kusen yang harus diulang segera. Karena ketika proses server latar belakang Anda bangun pada malam hari dan perusahaan mulai cepat kehilangan uang, maka "Kesalahan telah terjadi dalam transaksi ini" adalah hal terakhir yang ingin Anda lihat dalam log diagnostik.


Tentu saja ada kemungkinan log teknologi server (termasuk dalam produksi, kan?) Entah bagaimana membantu mendiagnosis masalah, tetapi sekarang saya tidak dapat menebak sekaligus bagaimana menemukan alasan sebenarnya untuk kesalahan yang ditunjukkan di dalamnya. Tapi alasan sebenarnya adalah satu - programmer Vasya mendapat pengecualian di dalam transaksi dan memutuskan itu sekali - bukan karabas "Pikirkan, salah, mari kita lanjutkan."


Apa transaksi dalam 1C


Memalukan menulis tentang kebenaran dasar, tetapi, tampaknya, sedikit harus. Transaksi dalam 1C sama dengan transaksi dalam DBMS. Ini bukan beberapa transaksi ā€œ1Cā€ khusus, ini adalah transaksi dalam DBMS. Menurut ide umum transaksi, mereka dapat dieksekusi secara keseluruhan atau tidak sama sekali. Semua perubahan pada tabel database yang dibuat dalam transaksi dapat dibatalkan segera, seolah-olah tidak ada apa-apa.


Selanjutnya, Anda perlu memahami bahwa 1C tidak mendukung transaksi bersarang. Sebenarnya, mereka tidak didukung bukan "dalam 1C", tetapi tidak didukung sama sekali. Setidaknya, DBMS yang dapat digunakan oleh 1C. Transaksi bersarang, misalnya, tidak ada dalam MS SQL dan Postgres. Setiap panggilan "bersarang" untuk Mulai Transaksi hanya meningkatkan penghitung transaksi, dan setiap panggilan ke "Transaksi Komit" mengurangi penghitung ini. Perilaku ini dijelaskan dalam banyak buku dan artikel, tetapi kesimpulan dari perilaku ini, tampaknya, tidak dipahami dengan baik. Sebenarnya, dalam SQL ada yang disebut SAVEPOINT, tetapi 1C tidak menggunakannya, dan masalahnya cukup spesifik.


Selanjutnya, terutama untuk Warriors of True Faith, yang percaya bahwa kode harus ditulis hanya dalam bahasa Inggris, di bawah spoiler akan diberikan analog kode dalam sintaksis bahasa Inggris 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/id419715/


All Articles