原文链接:http://longdechuanren.iteye.com/blog/632403
1、事务的概念与JDBC事务处理
(1)原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。
(2)一致性(consistency):在事务处理执行前后,数据库是一致的(两个账户要么都变,或者都不变)。
(3)隔离性(isolcation):一个事务处理对另一个事务处理没有影响。
(4)持续性(durability):事务处理的效果能够被永久保存下来 。
举例:银行转账
connection.setAutoCommit(false);//打开事务。
.....
....把进行转账的两步操作放在同一个事务中,如果一个出现异常,马上回滚
.....
connection.commit();//提交事务。
connection.rollback();//回滚事务。
2、事务的保存点处理:定义保存点可以用来回滚一部分内容
- static void test() throws SQLException {
- Connection conn = null;
- Statement st = null;
- ResultSet rs = null;
- //定义保存点
- Savepoint sp = null;
- try {
- conn = JdbcUtils.getConnection();
- conn.setAutoCommit(false);
- st = conn.createStatement();
- //修改张三的money值
- String sql = "update user set money=money-10 where id=1";
- st.executeUpdate(sql);
- //设置保存点
- sp = conn.setSavepoint();
- //修改王五的money值
- sql = "update user set money=money-10 where id=3";
- st.executeUpdate(sql);
- sql = "select money from user where id=2";
- rs = st.executeQuery(sql);
- float money = 0.0f;
- if (rs.next()) {
- money = rs.getFloat("money");
- }
- //如果李四的money的值>300就抛出异常
- if (money > 300)
- throw new RuntimeException("已经超过最大值!");
- sql = "update user set money=money+10 where id=2";
- st.executeUpdate(sql);
- conn.commit();
- } catch (RuntimeException e) {
- if (conn != null && sp != null) {
- //rollback的时候要定义保存点,否则会全部回滚
- conn.rollback(sp);
- conn.commit();
- }
- throw e;
- } catch (SQLException e) {
- if (conn != null)
- conn.rollback();
- throw e;
- } finally {
- JdbcUtils.free(rs, st, conn);
- }
- }
总结:
1).如果上面的调用产生了异常,那么张三账号的会减少,而王五的钱不会变少:保存点之后的内容会被回滚,而保存点之前的内容不会被回滚。
2).事务的回滚也可以不回滚所有的操作,比如一件事需要三步完成,我们可以在走完第一步后设置一个保存点,然后再进行第二步和第三步,一旦发生异常,回滚到保存点即可,此时保存点以后的操作会回滚,而保存点以前的不会(未完全回滚)。
备注:.在MySql数据库使用过程中如果发现某个数据库对事务的支持不是很好(比如不能提交或不能回滚),则很可能是数据库的引擎使用不合适(数据库引擎有很多种,比如InnoDB,MyIsam,其中InnoDB支持数据库事务,而MyIsam不支持)
3、JTA分布式事务的简要介绍
跨越多个数据源的事务,使用JTA容器实现事务。
分成两阶段提交。
- javax.transaction.UserTransaction tx = (UserTransaction)ctx.lookup(“jndiName");
- tx.begin();
- //connection1 connection2 (可能来自不同的数据库)…
- tx.commit();//tx.rollback();
备注:要想实现JTA事务需要JTA容器(Tomcat没有,Weblogic,Websphere有)的支持,JTA容器就行一个指挥官,指挥着所有的数据库(一般发2道指令),他会先发出一个提交的请求给所以数据库,如果此时有数据库表示要回滚,则容器会通知其他数据库一起回滚,如果没有数据库提出回滚,此时发第二道命令,所有数据库一起提交。
4、事务的隔离级别
查看与设置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:回滚事务
特别说明:本人转载文章纯为技术学习,总结经验,并无其他目的,若有他人继续转载,请链接原作者的地址,而不是本文的地址,以示对作者的尊重。最后对原作者的辛勤劳动表示感谢!