1、事务
情景:在银行转账时,要对数据库进行两个操作,即将一个账户的钱减少,将另一个账户的钱增多。但是由于操作的先后顺序,如果在两个操作之间发生故障,则会导致数据不一致。因此,需要设计一个事务,在两条语句都被执行成功后,数据修改才被真正提交(Commit)放入数据库,否则数据操作回滚(Rollback)。
在默认情况下,executeUpdate函数会在数据库中提交改变的结果,此时,可以用Connection来定义该函数是否自动提交改变结果,并进行事务的提交或者回滚。下面来看一段代码:
import java.sql.Connection;从以上代码可以看出,Connection中可以设置executeUpdate不要自动提交,代码如下:
import java.sql.DriverManager;
import java.sql.Statement;
public class Transaction {
public static void main(String[] args) throws Exception {
Connection conn = null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn = DriverManager.getConnection("jdbc:odbc:DSSchool");
Statement stat = conn.createStatement();
conn.setAutoCommit(false);// 设置为不要自动提交
String sql1 = "update Tstudent set age=25 where id=4";
String sql2 = "update Tstudent set name='suuw150' where id=4";
stat.executeUpdate(sql1);
stat.executeUpdate(sql2);
conn.commit(); // 提交以上sql1,sql2事务
} catch (Exception ex) {
conn.rollback(); // 回滚
} finally {
conn.close();
}
}
}
conn.setAutoCommit(false);以下代码的意思是是在两条sql语句运行后,提交这个操作:
stat.executeUpdate(sql1);发生异常后,执行后的修改将会回退:
stat.executeUpdate(sql2);
conn.rollback();这样就保证了两条语句要么全部执行,要么全部不执行。