execute、 executeQuery 、 executeUpdata
数据库事务
事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。 一组逻辑操作单元:一个或多个DML操作
事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个十五中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。
————————————————————————————————————————
事务的ACID属性
1.原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2.一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态
3.隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其它事务干扰,即一个事物内部的操作及使用的数据对并发的其他事物是隔离的,并发执行的各个事务之间不能互相干扰。
4.持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
————————————————————————————————————————
使用同一jdbc连接保持数据一致性数据库事务代码:数据库事务的转账操作
public int updata(Connection conn, String sql, Object...args){
PreparedStatement ps = null;
try{
//1.预编译sql语句,返回PreparedStatement的实例
ps = conn.prepareStatement(sql);
//2.填充占位符
for(init i=0; i<args.lenth;i++){
ps.setObject(i+1, args[i]);//小心参数声明错误!!
}
//3.执行
return ps.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
//4.资源关闭,不关闭连接
JDBCUtils.closeUtil(null, ps);
}
return 0;
}
Connection conn =null;
try{
conn = JDBCUtils.getConnection();
//取消数据的自动提交
conn.setAutoCommit(false);
String sql1 = "update user set balance = balance - 10 where id=?";
updata(conn,sql1, 1);
//模拟发生异常
//System.out.println(10 / 0);
String sql2 = "update user set balance=balance+10 where id=?";
updata(conn, sql2, 2)
System.out.println("转账成功");
//提交数据
conn.commit();
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.closeR(conn, null);
}
若此时Connection没有被关闭,还可能被重复使用,则需要恢复期自动提交状态setAutoCommit(true)、尤其是在使用数据库连接池技术时,执行close()方法前,建议回复自动提交状态。
设置隔离等级并发修改、查询数据库
//获取当前连接的隔离级别
conn.getTransactionIsolation();
//设置数据库的隔离级别:
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);