1. 程式人生 > 其它 >java記憶體問題排查

java記憶體問題排查

技術標籤:mysql資料庫sqljdbcjava

不使用事務的情況:

假設業務操作是:加血,減血各做一次,結束後,英雄的血量不變。
而減血的SQL語句不小心寫錯寫成了 updata(而非update),
那麼最後結果是血量+1,而非期望的不變。

String sql1 = "update hero set hp = hp +1 where id = 22";
s.execute(sql1);
//報錯:sql語句錯誤。該錯誤只導致“減血”操作失敗,但“加血”操作沒有影響
String sql2 = "updata hero set hp = hp -1 where id = 22"
; s.execute(sql2);

使用事務的情況:

在事務中的多個操作,要麼都成功,要麼都失敗
使用c.setAutoCommit(false);關閉自動提交
使用c.commit();進行手動提交
在c.setAutoCommit(false);和c.commit();之間的資料庫操作,就處於同一個事務當中,要麼都成功,要麼都失敗
所以,雖然第一條SQL語句是可以執行的,但是第二條SQL語句有錯誤,其結果就是兩條SQL語句都沒有被提交, 除非兩條SQL語句都是正確的。

c.setAutoCommit(false);//關閉自動提交
  
// 加血的SQL
String sql1 = "update hero set hp = hp +1 where id = 22"
; s.execute(sql1); // 減血的SQL // 不小心寫錯寫成了 updata(而非update) String sql2 = "updata hero set hp = hp -1 where id = 22"; s.execute(sql2); c.commit();// 手動提交

事務條件:

在MySQL中,只有當表的型別是INNODB的時候,才支援事務,所以需要把表的型別設定為INNODB,否則無法觀察到事務。
查看錶的型別的SQL:

show table status from 資料庫名; 

在這裡插入圖片描述
修改表的型別為INNODB的SQL:

alter table 表名 ENGINE  =
innodb;