Ati folosit proceduri stocate in MySQL

Nu cred că-i o problemă tehnică în primul rând, ci una de business.
Cum s-ar rezolva, pe lângă reguli să existe și exemple concrete care să arate ce s-ar putea întâmpla în fiecare din cazuri și de ce este important sau câtă valoare aduce în funcționarea afacerii. După ce s-ar clarifica aceste lucruri într-o anumită măsură, evident te poți gândi și la diferite modalități tehnice :slight_smile:

1 Like

@isti37 Ce ma gandeam eu era ceva de genul START TRANSACTION din Postgres. Poti sa pui cod de genul asta intr-un raw query in ORM-ul ales, de exemplu. Sau, iarasi, echivalent more-or-less, majoritatea clientilor au o interfata OK pentru tranzactii. De exemplu, in C# cu Dapper poti face ceva de genul[1]:

using (var tx = conn.beginTransaction()) {
    var id = tx.query<int>('insert into Users (name, age) values ("John Doe", 30) returning id');
    tx.execute('insert into UserEvents (userId, timestamp) values (@id, getutcdate())', new { userId = id });
}

Care s-ar executa intr-o tranzactie si cu toate proprietatile pe care le doresti.


@atufa Cred ca e o dihotomie gresita SQL vs NoSQL. Trebuie sa alegi unealta potrivita pentru problema pe care o ai. Si sunt probleme pe care bazele de date SQL, in forma lor actuala nu le pot adresa bine. Ar fi ideal sa fie un singur sistem de management al datelor, in care sa poti sa pui si datele organizatorice, si log-uri, sa-ti faca si data warehousing, sa ai si search à la ElasticSearch, sa poti sa trimiti si toate metricile colectate, sa ai si blob-storage, sa poti sa ai si ACID si BASE / AP sau CP in functie de nevoie, si eventual sa fie si multi-homed global. Dar inca nu exista asa ceva, iar problemele care apar in practica impun folosirea a diverse unelte. Te poti descurca cu RDBMS multa vreme insa, dar la un moment dat o sa fie nevoie si de altceva. Iar nevoia apare de obicei din cauza ca sunt prea multe tranzactii cu un volum de date prea mare. Eventual si cu cerinte de latenta foarte mici.

De exemplu, din experienta mea in AdTech, nu exista vre-un acces la baze de date pe hot-path-ul servirii unei reclame. Fie sunt citiri din date cache-uite in memoria procesului server, fie RPC-uri la alt serviciu cu aceiasi restrictii, fie acces la Redis/Memcache/ElasticSearch/BigTable/HBase etc. - baze de date care-ti dau un raspun in mai putin de 5ms in principiu, ca sa poti sa faci intreg procesul sub 100ms. Mai mult, intr-un caz Redis joaca un rol important in infrastructura si nu e numai un cache. In sensul ca daca ar fi down, n-ar rezulta doar o incetinire sau overload al sistemului, ci chiar nu ar mai merge corect.

OTOH, pe partea de stocare a datelor “centrale” - tabela de utilizatori sau produse, tot RDBMS-uri sunt de baza inca, si nu exista un challenger bun pentru ele. Desi, dupa cum ziceam si mai inainte, sisteme precum Spanner/F1 sau CosmosDB spre spatiul asta tind, si au un feature-set interesant pe partea asta.

Cat despre SQL, trebuie sa recunosti ca nu-i un limbaj tocmai grozav. E puternic si flexibil, dar si destul de quirky [2] si oarecum nefamiliar programatorilor non-SQL. Si nu cred ca trebuie blamati oamenii pentru ca vor sa lucreze intr-un mediu tehnic mai bun. Din nefericire, multe solutii NoSQL din familia document stores ofera doar modelare mai buna a problemei, dar nu si alte feature-uri esentiale, ca tranzactii sau lipsa bug-urilor critice


[1] Doar .query si .execute tin de Dapper. Restul e libraria standard de interactiune cu DB-ul din C#.
[2] Din start ai select $stuff from $table dar insert/update into $table $stuff :sunny:

7 Likes

Am online slide-urile, poate ajuta putin.

Trebuie sa alegi arhitectura impreuna cu clientul. De exemplu, eu as merge pe ideea in care stocul online nu e blocat, ci se confirma doar la pasul final, de achizitie. In timpul in care eu ma dau pe site si introduc produse in cos, daca acestea se cumpara fizic in magazin (la casa de marcat), atunci eu cand am introdus datele cardului nu le mai am disponibile, si aflu asta de la sistemul software. Dar e doar o varianta, se poate f bine ca business ownerul sa spuna “tanti de la casa trebuie sa ii precizeze omului care are produsele in cos ca nu i le poate da pt ca au fost deja cumparate online”.

Toate aceste scenarii (absolut toate cazurile la limita) trebuiesc discutate individual cu beeneficiarul solutiei software, si el este cel care trebuie sa isi asume cum ii functioneaza business-ul, noi ca pameni tehnici putem doar face recomandari si estimari de durata/cost implementare pt fiecare tip posibil. Adica ce a zis si @silviuctinvoicu. In asta consta jobul meu in ultimii 10 ani, sa port aceste discutii si sa fac aceste estimari, inainte de a ma arunca la implementare. Chiar daca business-ul pt care eu rezolv acuma problema activeaza pe aceeasi piata pentru care eu am rezolvat deja la un concurent si i-am livrat o solutie, este fundamental gresit sa merg sa ii vand acelasi lucru. Practic fiecare business este diferit; de aceea software-ul nu se poate face “la metru”, ci custom. Cand vom intelege ca prezentarile de pe net sunt doar niste guidelines care arata cum s-a rezolvat o problema date fiind anumite constrangeri ale unui client specific, vom reusi sa extragem din ele chestiunile care ne sunt folositoare.

Din punct de vedere tehnic, asa cum explic si in prezentare, sunt doar cateva lucruri care trebuiesc restrictionate la modelul tranzactional (in cazul descris de tine as zice “stocul produsului cu ID 7 este de 15 bucati”), nu si produsul in side, denumirea lui, descrierea tehnica, etc. Pentru acestea din urma se pot folosi modele non-tranzactionale, in modul descris de @horia141. E foarte mult de povestit, insa concluzia mea este ca aceia care au un sablon software pe care il aplica unor business-uri diferite nu fac altceva decat sa imi aduca mie clienti mai tarziu :slight_smile:

11 Likes

Am avut o tentativa sa le folosesc in Mysql. Insa, in loc de rezultatul dorit, am fost intampinat de mesaje de eroare si sange sub query-ul scris in Mysql Workbench :smiley:
In MSSQL am folosit destul de mult proceduri stocate