分佈式事務【1】【數據庫事務演示】: https://yuanyu.blog.csdn.net/article/details/104218792
/**
* 張三給李四轉賬100元
*/
@Test
public void transfer() throws SQLException {
Connection conn = null;
Statement stmt = null;
try {
conn = JDBCConnectionUtil.getConnection();
// 將自動提交設置爲false
// 若設置爲true則數據庫將會把每一次數據更新認定爲一個事務並自動提交
conn.setAutoCommit(false);
stmt = conn.createStatement();
// 將 “張三” 賬戶中的金額減少100
stmt.execute("UPDATE account SET money = money - 100 WHERE name = '張三'");
//TODO 發生了異常
//int a = 1/0;
// 將 “李四” 賬戶中的金額增加100
stmt.execute("UPDATE account SET money = money + 100 WHERE name = '李四'");
// 提交事務
conn.commit();
// 事務提交:轉賬的兩步操作同時成功
} catch (Exception sqle) {
try {
// 發生異常,回滾在本事務中的操做
// 事務回滾:轉賬的兩步操作完全撤銷
conn.rollback();
} catch (Exception ignore) {
}
sqle.printStackTrace();
} finally {
stmt.close();
conn.close();
}
}
//JDBCConnectionUtil
public static Connection getConnection() throws SQLException {
String url = "jdbc:mysql://localhost:3306/tx?serverTimezone=UTC&characterEncoding=utf-8";
String user = "root";
String password = "123456";
String className = "com.mysql.cj.jdbc.Driver";
try {
Class.forName(className);
} catch (ClassNotFoundException e) {
log.error(e.getMessage());
}
return DriverManager.getConnection(url, user, password);
}