事务

事务

我们可以将一组数据建成一个事务。当所有语句都顺利执行后,事务可以被提交,否则,如果其中某个语句遇到错误,那么事务将被回滚。

默认情况下,数据库连接处于自动提交模式,每个SQL命令一旦被执行便提交给数据库。之后便无法回滚,在使用事务时,需要关闭这个默认值

1
conn.setAutoCommit(false);

然后任意多次的调用executeUpdate方法,在执行了所有命令之后调用commit方法

1
conn.commit();

如果出现错误,可以回滚

1
conn.rollback();

保存点

创建一个保存点意味着稍后只需要返回这个点而不是事务的开头。

1
2
3
4
5
6
7
8
9
10
11
conn.setAutoCommit(false);
Statement stat=conn.createStatement();
stat.executeUpdate(command1);
Savepoint svpt=conn.setSavepoint();
//设置保存点
stat.executeUpdate(command2);
if(...)conn.rollback(svpt);
//回滚到保存点
conn.commit();
conn.releaseSavepoint(svpt);
//不再需要保存点时,必须释放它

批量更新

若有一个程序需要多次执行更新语句,可以使用批量更新的方法提高程序性能。在使用批量更新时,一个命令序列作为一批操作将同时被收集和提交。不过要使用DatabaseMetaData类中的,supportsBatchUpdates方法查看数据库是否支持这种特性(mysql是支持的)。

同一批操作可以包括insert、update、delete等操作,也可以是数据库定义命令,如create table和drop table。但是不能包含select操作,若有会抛异常

示例程序如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package transaction;

import java.sql.*;

import database.TestDB;

public class Transaction {

public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Connection conn= TestDB.getConnection();
boolean autoCommit=conn.getAutoCommit();
conn.setAutoCommit(false);
//屏蔽自动提交
Statement stat=conn.createStatement();
String sql=null;
for(int i=0;i<=5;i++){
sql="insert into avator(id)value("+i+")";
stat.addBatch(sql);
}
stat.executeBatch();
//批量执行
conn.commit();
//提交
conn.setAutoCommit(autoCommit);
stat.close();
conn.close();
}

}
Donate comment here