JDBC事务控制
-
事务:
- 一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骚要么同时成功,要么同时失败。
-
操作:
-
- 开后事务
-
- 提交事务
-
- 回滚事务
-
-
使用connection对象来管理事务
- 开启事务:
- setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开后事务
- 在执行sql之前开启事务
- 提交事务: commit()
- 当所有sql都执行完提交事务
- 回滚事务:rollback()
- 在catch中回滚事务
- 开启事务:
-
常用方法
方法名 | 说明 |
---|---|
void setAutoCommit(boolean autoCommit) | 将此连接的自动提交模式设置为给定状态,true启动自动提交模式,false手动提交。 |
void commit() | 使自上次提交/回滚以来所做的所有更改成为永久更改,并释放此 Connection 对象当前持有的所有数据库锁。 |
void rollback() | 撤消当前事务中所做的所有更改,并释放此 Connection 对象当前持有的所有数据库锁。 |
示例
package com.ningxiao.day17;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/*
author :wt
@create 2020-08-26 15:44
*/
public class Demo08 {
public static void main(String[] args) {
Connection connection = null;
try {
connection = JDBCUtils.getConnection();
connection.setAutoCommit(false);
String sql1 = "update account set balance = balance-500 where name=?";
PreparedStatement prest1 = connection.prepareStatement(sql1);
prest1.setNString(1,"zhangsan");
int a = 100/0;//人为制造异常
String sql2 = "update account set balance = balance+500 where name=?";
PreparedStatement prest2 = connection.prepareStatement(sql2);
prest2.setNString(1,"lisi");
prest1.executeUpdate();
prest2.executeUpdate();
connection.commit();
JDBCUtils.close(prest1,connection);
JDBCUtils.close(prest2,null);
} catch (Exception e) {
try {
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}
}
}