在JDBC的事物处理中,可以应用保存点技术,对一个事物中的处理进行部分提交.
如下示例,三个处理
1,张三减10元
2,李四加10元
3,李四加100元,
在3的地方出错的话,把1和2的处理进行提交,使用了保存点技术.
示例代码:
package test.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Savepoint;
public class SavePoint {
public static void main(String[] args) throws Exception {
savepoint();
}
public static void savepoint() throws Exception {
// TODO Auto-generated method stub
System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/jdbc", "root", "");
//初始化不自动提交
conn.setAutoCommit(false);
// 张三减10元
String sql = "update user set money = money - 10 where id = 1";
PreparedStatement st = conn.prepareStatement(sql);
st.executeUpdate();
// 李四加10元
sql = "update user set money = money + 10 where id = 2";
st = conn.prepareStatement(sql);
st.executeUpdate();
// 设立保存点
Savepoint sp = conn.setSavepoint();
// 李四加再加100元(SQL的where关键字写的不对,会出现异常)
sql = "update user set money = money + 100 wherewhere id = 2";
st = conn.prepareStatement(sql);
try {
st.executeUpdate();
} catch (Exception e) {
// 回滚到李四加10元后的状态
conn.rollback(sp);
System.out.println ("回滚到李四加10元后的状态");
}
conn.commit();
st.close();
conn.close();
}
}
执行文件后,查看数据库的记录,可以发现张三减少了10元,而李四增加了10元.
第三个处理李四再加100元的操作并没有进行.
总结:
1,开始要把connection设置成不进行自动提交
2,中间设定保存点
3,回滚的地方要使用保存点
4,最后不要忘记进行commit