传智播客李勇Jdbc视频笔记--事务(转载)

原文链接:http://longdechuanren.iteye.com/blog/632403

 

1、事务的概念与JDBC事务处理
(1)原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。
(2)一致性(consistency):在事务处理执行前后,数据库是一致的(两个账户要么都变,或者都不变)。
(3)隔离性(isolcation):一个事务处理对另一个事务处理没有影响。
(4)持续性(durability):事务处理的效果能够被永久保存下来 。
举例:银行转账
connection.setAutoCommit(false);//打开事务。
.....
....把进行转账的两步操作放在同一个事务中,如果一个出现异常,马上回滚
.....
connection.commit();//提交事务。
connection.rollback();//回滚事务。

2、事务的保存点处理:定义保存点可以用来回滚一部分内容

Java代码 传智播客李勇Jdbc视频笔记--事务(转载) 传智播客李勇Jdbc视频笔记--事务(转载)传智播客李勇Jdbc视频笔记--事务(转载)
  1. static void test() throws SQLException {   
  2.         Connection conn = null;   
  3.         Statement st = null;   
  4.         ResultSet rs = null;   
  5.         //定义保存点   
  6.         Savepoint sp = null;   
  7.         try {   
  8.             conn = JdbcUtils.getConnection();   
  9.             conn.setAutoCommit(false);             
  10.             st = conn.createStatement();   
  11.             //修改张三的money值   
  12.             String sql = "update user set money=money-10 where id=1";   
  13.             st.executeUpdate(sql);   
  14.             //设置保存点   
  15.             sp = conn.setSavepoint();   
  16.                
  17.             //修改王五的money值   
  18.             sql = "update user set money=money-10 where id=3";   
  19.             st.executeUpdate(sql);   
  20.   
  21.             sql = "select money from user where id=2";   
  22.             rs = st.executeQuery(sql);   
  23.             float money = 0.0f;   
  24.             if (rs.next()) {   
  25.                 money = rs.getFloat("money");   
  26.             }   
  27.             //如果李四的money的值>300就抛出异常   
  28.             if (money > 300)   
  29.                 throw new RuntimeException("已经超过最大值!");   
  30.             sql = "update user set money=money+10 where id=2";   
  31.             st.executeUpdate(sql);   
  32.   
  33.             conn.commit();   
  34.         } catch (RuntimeException e) {   
  35.             if (conn != null && sp != null) {   
  36.             //rollback的时候要定义保存点,否则会全部回滚   
  37.                 conn.rollback(sp);   
  38.                 conn.commit();   
  39.             }   
  40.             throw e;   
  41.         } catch (SQLException e) {   
  42.             if (conn != null)   
  43.                 conn.rollback();   
  44.             throw e;   
  45.         } finally {   
  46.             JdbcUtils.free(rs, st, conn);   
  47.         }   
  48.     }   
  49.       


总结:

1).如果上面的调用产生了异常,那么张三账号的会减少,而王五的钱不会变少:保存点之后的内容会被回滚,而保存点之前的内容不会被回滚。

2).事务的回滚也可以不回滚所有的操作,比如一件事需要三步完成,我们可以在走完第一步后设置一个保存点,然后再进行第二步和第三步,一旦发生异常,回滚到保存点即可,此时保存点以后的操作会回滚,而保存点以前的不会(未完全回滚)。 

 

备注:.在MySql数据库使用过程中如果发现某个数据库对事务的支持不是很好(比如不能提交或不能回滚),则很可能是数据库的引擎使用不合适(数据库引擎有很多种,比如InnoDB,MyIsam,其中InnoDB支持数据库事务,而MyIsam不支持)


3、JTA分布式事务的简要介绍
跨越多个数据源的事务,使用JTA容器实现事务。
分成两阶段提交。

Java代码 传智播客李勇Jdbc视频笔记--事务(转载) 传智播客李勇Jdbc视频笔记--事务(转载)传智播客李勇Jdbc视频笔记--事务(转载)
  1. javax.transaction.UserTransaction tx = (UserTransaction)ctx.lookup(“jndiName");   
  2.     tx.begin();   
  3.     //connection1 connection2 (可能来自不同的数据库)…    
  4.     tx.commit();//tx.rollback();  

 

备注:要想实现JTA事务需要JTA容器(Tomcat没有,Weblogic,Websphere有)的支持,JTA容器就行一个指挥官,指挥着所有的数据库(一般发2道指令),他会先发出一个提交的请求给所以数据库,如果此时有数据库表示要回滚,则容器会通知其他数据库一起回滚,如果没有数据库提出回滚,此时发第二道命令,所有数据库一起提交。

 

 

4、事务的隔离级别

传智播客李勇Jdbc视频笔记--事务(转载)

查看与设置mysql数据库的的隔离级别:
查看:select @@tx_isolation
未提交读:set transaction isolation level read uncommitted
提交读:set transaction isolation level read committed
不可重复读:set transaction isolation level repeatable committed

在默认情况下mysql的事务是自动提交的,输入命令strat transaction 表示你要
自己手动控制事务,mysql不会帮你自动提交事务 commit命令是提交当前事务
rollback:回滚事务

特别说明:本人转载文章纯为技术学习,总结经验,并无其他目的,若有他人继续转载,请链接原作者的地址,而不是本文的地址,以示对作者的尊重。最后对原作者的辛勤劳动表示感谢!