java記憶體問題排查
阿新 • • 發佈:2020-12-25
不使用事務的情況:
假設業務操作是:加血,減血各做一次,結束後,英雄的血量不變。
而減血的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;