java事务处理

什么是事务呢?事务有哪些特性呢? (ACID)

百科:http://baike.baidu.com/view/1298364.htm

 

java的事务模型有三种:

  • 1.本地事务模型

  • 2.编程事务模型

  • 3.声明事务模型

本地事务模型,我个人理解是 依赖JDBC 的Connection 事务设置的 ,我们一般写代码

Connection con =  null;
        con.setAutoCommit(false);
        Statement statement = con.createStatement();
        String sql = "update ....";
        try{
            statement.execute(sql);
            con.commit();
        }catch(Exception e){
            con.rollback();
            throw e;
        }finally{
            关闭连接
        }

主要是把Connection的自动提交事务的设置成false,让程序员代码方式来管理事务的 提交,这样很大的 依赖程序员的编码,以及后续对Connection 关闭的处理, 如果程序员忘记关闭连接,那就会造成内存泄露, 后果很严重的, 老大可是会很生气的,

编程事务模型和本地事务最大的区别是开发人员直接面对事务(transation),而不是Connection。在编程事务模型中,开发人员主要复杂开启事务和终止事务。虽然比本地事务对开发更友好了, 还是不推荐使用编程事务模型,(纯属吐槽: 可是我在的项目中,它恰恰也是用得这种事务模型, 说是用MYSQL 数据库对事务处理不好, 一个后台系统, 根本就没那么高的并发, 还把代码逻辑弄得一塌糊涂,事务都是用内部类来实现的,

声明事务模型完全由容器控制,这就意为作开发人员不用写任何事务代码。这种事务模型是比较推荐的 ,也是现在主流的架构师所推荐的。spring,ejb 都很好的支持这种事务模型, 只要在配置文件里配置一下, 对业务代码完全没什么污染

 

事务属性主要有六种,

  • Required 需要,如果上下文有个事务存在,则用这个,没有事务,则开启个新的事务(最常用的 )

  • Mandatory 强制必须,事先开启事务, 如果不存在,则抛出TransactionRequiredException异常

  • RequiresNew需要新的,每次都需要新的事务来支持, 如果事务已经开启了,此事务将被暂时挂起,容器启动一个新的事务。当这个新事务随着方法调用完成终止后,老的事务将会继续。

  • supports支持  并不需要特定的事务支持, 有就用, 没有就不用

  • NotSupported不支持  如果一个事务业已启动,容器会将此事务暂停直至方法调用结束。如果调用方法时没有事务存在,容器也不会为此方法开启任何事务

  • Never不用 不允许有事务存在

事务隔离级别

  • TransactionReadUncommitted 读取未提交

  • TransactionReadCommitted 读取已提交

  • TransactionRepeatableRead 可重复读

  • TransactionSerializable 可序列化

spring   @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)

主要针对接口方法级别事务控制, 必须要抛出异常,  @Transactional 也是基于AOP,字节码增强技术来实现的


你可能感兴趣的:(java事务处理)