首页 > 代码库 > Java-事务管理
Java-事务管理
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-520 pstat = conn.prepareStatement("update account set " + "money=money-? where name=?"); pstat.setDouble(1, 520); pstat.setString(2, "a"); pstat.executeUpdate(); //b+520 pstat = conn.prepareStatement("update account set " + "money=money+? where name=?"); pstat.setDouble(1, 520); pstat.setString(2, "b"); pstat.executeUpdate(); //设置回滚点 sp= conn.setSavepoint(); //b消费了1040 pstat = conn.prepareStatement("update account set " + "money=money-? where name=?"); pstat.setDouble(1, 1040); pstat.setString(2, "b"); pstat.executeUpdate(); //人为抛出一个异常 int x = 3/0; //a+1040 pstat = 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-事务管理