1.关于事务
前提:如果有多个操作,则必须保证所有的操作都同时使用一个连接,则无法保证事务
①:开启事务,取消Connection的默认提交功能
connection.setAutoCommit(false);
②:具体操作步骤
③:操作成功则提交事务,抛出异常则回滚事务(在catch块中)
connection.commit(); / connection.rollback();
2.事务的ACID属性
原子性:事务是一个不可分割的工作单位,事务中的操作要么都发送,要么都不发生
一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态
隔离性:事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务直接不能互相干扰
持久性:事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响
public class TransactionTest {
@Test
public void testTransaction() {
Connection connection = null;
try {
//获取连接
connection = JDBCTools.getConnection();
//取消事务的默认提交功能
connection.setAutoCommit(false);
String sql = "UPDATE users SET balance = 500 WHERE id = 1";
//执行更新操作
update(connection, sql);
//指定抛出异常,执行事务回滚
int result = 10 / 0;
System.out.println(result);
sql = "UPDATE users SET balance = 1500 WHERE id = 2";
//执行更新操作
update(connection, sql);
//若无异常,则提交事务
connection.commit();
} catch (Exception e) {
e.printStackTrace();
try {
//若发生异常,则执行事务的回滚
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
JDBCTools.release(null, null, 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.release(null, preparedStatement, null);
}
}
}
程序发生异常后,数据库并未发生改变,成功执行回滚功能