1.事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。
-
> 一组逻辑操作单元:一个或多个DML操作。
2.事务处理的原则:
保证所事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。
当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存
下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
说明:
1.数据一旦提交,就不可回滚
*
2.哪些操作会导致数据的自动提交?
-
>DDL操作一旦执行,都会自动提交。
-
>set autocommit = false 对DDL操作失效
-
>DML默认情况下,一旦执行,就会自动提交。
-
>我们可以通过set autocommit = false的方式取消DML操作的自动提交。
-
>默认在关闭连接时,会自动的提交数据
解决办法
多个事务互相影响,共用一个Connection 数据库连接
public class transcation {
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.execute();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.CloseConnect_Statement(null,preparedStatement);
}
// connection.rollback();
}
@Test
public void test() {
//共用一个连接
Connection connection = JDBCUtils.getConnection();
try {
connection.setAutoCommit(false);
String sql1="update user_table set balance = balance -100 where user=?";
update(connection,sql1,"AA");
//模拟网络出现异常 回滚操作 rollback
System.out.println(10/0);
String sql2="update user_table set balance = balance +100 where user=?";
update(connection,sql2,"BB");
System.out.println("successful!");
//提交事务
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
} finally {
JDBCUtils.CloseConnect_Statement(connection,null);
}
}
}