getc 自己 forname rollback ger [] string 将不
1、事务的概念: 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。
2、 管理事务:
2.1. 数据库默认的事务数据库默认支持事务的, 但是数据库默认的事务是一条 sql 语句独占一个事务, 这种模式, 意义不大。2.2. 手动控制事务如果希望自己控制事务也是可以的: start transaction;-- 开启事务, 在这条语句之后的所有的 sql 将处在同一事务中, 要么同时完成要么同时不完成 ......-- 事务中的 sql 在执行时, 并没有真正修改数据库中的数据 commit; -- 提交事务, 将整个事务对数据库的影响一起发生 rollback; -- 回滚事务, 将这个事务对数据库的影响取消掉
2.3. JDBC 中控制事务 Connection conn PreparedStatement pstat ResultSet rs 当 Jdbc 程序向数据库获得一个 Connection 对象时,默认情况下这个 Connection 对象会自动向数据库提交在它上面发送的 SQL 语句。若想关闭这种默认提交方式,让多条 SQL 在一个事务中执行,可使用下列语句: conn.setAutoCommit(false); -- 关闭自动提交后, conn 将不会帮我们提交事务, 在这个连接上执行的所有 sql 语句将处在同一事务中, 需要我们是手动的进行提交或回滚 conn.commit();-- 提交事务 conn.rollback(); -- 回滚事务 也可以设置回滚点回滚部分事务。 Savepoint sp = conn.setSavepoint(); conn.rollback(sp); -- 注意, 回到回滚点后, 回滚点之前的代码虽然没被回滚但是也没提交呢, 如果想起作用还要做 commit 操作.
- public class TranDemo {
- public static void main(String[] args) {
- Connection conn =null;
- PreparedStatement pstat =null;
- Savepoint sp =null;
- try{
- //String url = "jdbc:mysql://ip:3306/database";String url = "jdbc:mysql:///day20";
- Class.forName("com.mysql.jdbc.Driver");
- conn= DriverManager.getConnection(url,
- "root", "root");
- //开启事务conn.setAutoCommit(false);
- //a-520pstat = conn.prepareStatement("update account set " +
- "money=money-? where name=?");
- pstat.setDouble(1, 520);
- pstat.setString(2, "a");
- pstat.executeUpdate();
- //b+520pstat = conn.prepareStatement("update account set " +
- "money=money+? where name=?");
- pstat.setDouble(1, 520);
- pstat.setString(2, "b");
- pstat.executeUpdate();
- //设置回滚点sp= conn.setSavepoint();
- //b消费了1040pstat = conn.prepareStatement("update account set " +
- "money=money-? where name=?");
- pstat.setDouble(1, 1040);
- pstat.setString(2, "b");
- pstat.executeUpdate();
- //人为抛出一个异常
- intx = 3/0;
- //a+1040pstat = conn.prepareStatement("update account set " +
- "money=money+? where name=?");
- pstat.setDouble(1, 1040);
- pstat.setString(2, "a");
- pstat.executeUpdate();
- //提交事务
- conn.commit();
- }catch (Exception e) {
- if(conn!=null){
- if(sp!=null){
- try {
- //回滚到到sp
- conn.rollback(sp);
- //将转账的操作提交
- conn.commit();
- } catch (SQLException e1) {
- e1.printStackTrace();
- }
- }else{
- try {
- //回滚事务开启的地方
- conn.rollback();
- } catch (SQLException e1) {
- e1.printStackTrace();
- }
- }
- }
- }finally{
- //关闭数据库连接。。。。
- }
- }
- }
Java - 事务管理
来源: http://www.bubuko.com/infodetail-2118487.html