JDBC(七)數據庫事務與JDBC事務處理


1. 數據庫事務


1)在數據庫中,事務:一組邏輯操作單元,使數據從一種狀態變換到另外一種狀態。


2)事務的屬性




2. 案例


	//a 給 b 匯款
@Test
public void testTransaction(){

try {
//a 的monery - 50
String sql = "UPDATE user SET monery = " +
"monery - 50 WHERE id = 1";
JDBCTools.update(sql);
// 在這裡發生瞭一個異常
int i = 10 / 0;
System.out.println(i);

//b 的monery +50
sql = "UPDATE user SET monery = " +
"monery + 50 WHERE id = 2";
JDBCTools.update(sql);

} catch (Exception e) {
e.printStackTrace();
}
}

結果:a的錢少瞭50,b的錢沒變,這不符合實際意義,也違反瞭事務。




3. JDBC事務處理



	/**
* 關於事務: 如果多個操作, 每個操作使用的是自己的單獨的連接, 則無法保證事務!!!
* 1). 事務操作開始前, 開始事務:取消 Connection 的默認提交行為. connection.setAutoCommit(false);
* 2). 如果事務的操作都成功, 則提交事務: connection.commit();
* 3). 回滾事務: 若出現異常, 則在 catch 塊中回滾事務:
*/
@Test
public void testTransaction2(){
Connection connection = null;

try {
connection = JDBCTools.getConnection();
// 開始事務: 取消默認提交.
connection.setAutoCommit(false);
String sql = "UPDATE user SET monery = " +
"monery - 50 WHERE id = 1";
update(connection, sql);
int i = 10 / 0;
System.out.println(i);

sql = "UPDATE user SET monery = " +
"monery - 50 WHERE id = 2";
update(connection, sql);

// 提交事務
connection.commit();
} catch (Exception e) {
e.printStackTrace();

// 回滾事務
try {
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
JDBCTools.releaseDB(null, null, connection);
}
}
//保證Connection 是同一個
public void update(Connection connection, String sql, Object... args) {
PreparedStatement preparedStatement = null;

try {
preparedStatement = connection.prepareStatement(sql);

for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}

preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseDB(null, preparedStatement, null);
}
}


4. 數據庫的事務隔離級別



1)oracle 的默認事務隔離級別:READ COMMITED,隻支持 READ COMMITED 和 SERIALLZABLE 。


2)mysql 的默認事務隔離級別:REPEATABLE READ,四種都支持。


3)在mysql 中:


① 查看當前的隔離級別: SELECT@@tx_isolation;


② 設置當前 mySQL 連接的隔離級別:


– set transaction isolation level

read committed;


③ 設置數據庫系統的全局的隔離級別:


– set global transaction isolation level read committed;


4)在 JDBC 程序中可以通過 Connection 的 setTransactionIsolation 來設置事務的隔離級別:


– connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

0 個評論

要回覆文章請先登錄註冊