Kenapa transaksi dibutuhake

Asring banget, nalika nggarap database, ana kahanan nalika sampeyan kudu nindakake macem-macem tumindak, nanging mung nggawe pangertèn bebarengan.

Contone, kita nulis piranti lunak perbankan sing kudu nindakake telung perkara:

  • Mbatalake dhuwit saka akun pelanggan
  • Tambah dhuwit menyang akun panampa
  • Rekam data kiriman ing "log kiriman"

Yen ana kesalahan nalika nindakake samubarang tumindak kasebut, mula loro liyane uga kudu dibatalake. Sampeyan ora bisa nulis dhuwit saka klien lan ora ditambahake menyang panampa? Inggih, utawa nambah menyang panampa, nanging ora nulis mati saka klien?

Dadi, panglompokan logis saka tumindak sing beda-beda dadi siji diarani transaksi . Ing tembung liya, transaksi minangka klompok tumindak sing mung kudu ditindakake bebarengan . Yen tumindak gagal utawa ditindakake kanthi kesalahan, kabeh tumindak liyane kudu dibatalake.

Transaksi biasane duwe telung negara:

  • negara wiwitan - kahanan sistem sadurunge nglakokake klompok tumindak
  • negara sukses - negara sawise klompok tumindak rampung
  • negara gagal - ana sing salah

Ing kasus iki, biasane ana telung prentah:

  • miwiti / miwiti - kaleksanan sadurunge wiwitan klompok logis saka tumindak
  • commit - dieksekusi sawise grup tumindak transaksi
  • rollback - miwiti proses ngasilake sistem saka negara gagal menyang negara wiwitan

Kerjane kaya iki.

Pisanan sampeyan kudu mbukak transaksi - nelpon metode wiwitan () utawa wiwitan () . Nelpon cara iki nuduhake negara sistem sing bakal nyoba bali yen ana masalah.

Banjur kabeh tumindak ditindakake, sing digabungake dadi klompok logis - transaksi.

Banjur metode commit () diarani . Telpon kasebut minangka tandha pungkasan saka klompok tumindak sing logis, lan uga biasane miwiti proses ngetrapake tumindak kasebut.

Kelingan carane kita nulis soko ing FileWriter: pisanan, kabeh sing kita tulis disimpen ing memori, banjur nalika flush () cara disebut , kabeh data saka buffer ing memori ditulis kanggo disk. Flush () iki minangka komitmen transaksi.

Ya, yen ana kesalahan nalika operasi transaksi, sampeyan kudu miwiti proses bali menyang negara wiwitan. Proses iki disebut rollback () , lan cara jeneng sing padha biasane tanggung jawab kanggo.

Secara kasar, ana 2 cara kanggo ngrampungake transaksi:

  • COMMIT - kita konfirmasi kabeh owah-owahan sing digawe
  • ROLLBACK - muter maneh kabeh owah-owahan sing digawe

Transaksi ing JDBC

Meh saben DBMS bisa nggarap transaksi. Dadi JDBC uga duwe dhukungan kanggo kasus iki. Kabeh wis dileksanakake banget prasaja.

Pisanan, saben telpon kanggo eksekusi () cara obyek Statement kaleksanan ing transaksi kapisah. Kanggo nindakake iki, Sambungan duwe parameter AutoCommit . Yen wis disetel kanggo true , banjur commit () bakal disebut sawise saben telpon kanggo eksekusi () cara .

Kapindho, yen sampeyan pengin nglakokake sawetara perintah ing siji transaksi, sampeyan bisa nindakake kaya iki:

  • mateni AutoCommit
  • nimbali dhawuh kita
  • nelpon cara commit () eksplisit

Iku katon banget prasaja:

connection.setAutoCommit(false);

Statement statement = connection.createStatement();
int rowsCount1 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");
int rowsCount2 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");
int rowsCount3 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");

connection.commit();

Yen ana kesalahan ing server nalika cara commit () mlaku , banjur SQL server bakal mbatalake kabeh telung tumindak.

Nanging ana kahanan nalika kesalahan isih ana ing sisih klien, lan kita ora tau njaluk commit () cara telpon :

connection.setAutoCommit(false);

Statement statement = connection.createStatement();
int rowsCount1 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");
int rowsCount2 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");
int rowsCount3 = statement.executeUpdate("UPDATE multiple typos will result in an exception");

connection.commit();

Yen ana kesalahan sak eksekusi siji executeUpdate () , banjur commit () cara ora bakal disebut. Kanggo muter maneh kabeh tumindak dijupuk, sampeyan kudu nelpon cara rollback () . Biasane katon kaya iki:

try{
  	connection.setAutoCommit(false);

  	Statement statement = connection.createStatement();
  	int rowsCount1 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");
  	int rowsCount2 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");
  	int rowsCount3 = statement.executeUpdate("UPDATE multiple typos will result in an exception");

	  connection.commit();
 }
 catch (Exception e) {
   connection.rollback();
}

Savepoints

Kanthi tekane JDBC 3.0, dadi bisa luwih efisien karo rollback transaksi. Saiki sampeyan bisa nyetel titik nyimpen - nyimpen poin, lan nalika sampeyan nelpon operasi rollback () , muter bali menyang titik nyimpen tartamtu.

Kanggo nyimpen, sampeyan kudu nggawe savepoint, iki rampung karo printah:

Savepoint save = connection.setSavepoint();

Bali menyang savepoint wis rampung karo printah:

connection.rollback(save);

Ayo nyoba nambah titik nyimpen sadurunge printah masalah:

try{
  	connection.setAutoCommit(false);

  	Statement statement = connection.createStatement();
  	int rowsCount1 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");
  	int rowsCount2 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");

  	Savepoint save = connection.setSavepoint();
 	 try{
      	int rowsCount3 = statement.executeUpdate("UPDATE multiple typos will result in an exception");
 	 }
 	 catch (Exception e) {
    	   connection.rollback(save);
 	 }

	  connection.commit();
 }
 catch (Exception e) {
   connection.rollback();
}

Kita ngatur transaksi bersarang kanthi nambahake titik simpen sadurunge nelpon metode masalah, lan bali menyang negara sing disimpen kanthi nelpon metode rollback(simpen) .

Ya, iku banget padha kanggo nyimpen / mbukak ing game.