对于Spring事物的理解

        使用事物前,我们需要对事物的定义有一定的了解,至于事物的定义,我们需要定义出这个事物在遇到各自问题的时候会如何运作,事物可能遇到以下问题:

事物的定义:

        1)事物的传播机制:如果该事物在另一个事物之中(是一个嵌套)的情况下该如何运作,以及不在另一个事物之中的情况下该如何运作的问题。

        Required:如果该事物在另一个事物之中,则加入该事物;如果不在,则创建一个新事物。(默认)

        Required new:如果该事务在另一个事物之中,则将原本的事物挂起,创建一个新事物,与原来的事物相互独立。

        Mandate:强制,如果在事物之中,则加入,否则抛异常。

        Nested:嵌套,如果在一个事物中,则在事物中创建一个事物,若没有,则创建新事物。

        2)事物的隔离级别:事物和另一个事物并行到来时,该如何处理

        Read Uncommitted :允许脏读,不可重复读和幻读。

        Read Committed:不允许脏读,允许不可重复读和幻读。

        Repeatable Read:不允许脏读,且为可重复读,但是可能存在幻读。

        Serializable:串行执行事物,都能解决,但是效率很低。

        3)事物的超时:多久内没有完成该事物就执行回滚操作

        4)事物的只读属性:如果该事物不涉及对数据的修改,数据库可能会对此进行一定的效率优化

        5)事物的回滚规则:遇到哪些异常进行回滚,哪些异常不回滚。

        在这些都定义好之后,我们就会知道在各自情况下我们的事物会如何运作了。

事物的状态:

        我们在使用事物时通常也会关心当前事物处于什么状态,以及对当前正在进行的事物进行提交和回滚的操作,我们需要给予TransactionManager一个唯一标识事物的参数,它来帮我们提交或者回滚。

TransactionStatus有以下几个状态:

public interface TransactionStatus{    
    boolean isNewTransaction(); // 是否是新的事务
    boolean hasSavepoint(); // 是否有恢复点
    void setRollbackOnly();  // 设置为只回滚
    boolean isRollbackOnly(); // 是否为只回滚
    boolean isCompleted;    //是否已完成
}

用法:

@Autowired
private PlatformTransactionManager transactionManager;

public void testTransaction() {

  TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
          try {
               // ....  业务代码
              transactionManager.commit(status);
          } catch (Exception e) {
              transactionManager.rollback(status);
          }
}

        Spring将事物通过给出一个抽象层PlatformTransactionManager接口(这应该是一个SPI,服务调用者给出自己的接口,各个服务提供者去具体实现),关于TransactionStatus:实际上,我们并不是实际在Spring内产生一个事物并去操作它,事物是产生在我们使用的数据库上,我们只是在远程的控制这个事物,因此我们需要知道它的实时状态,以完成我们的事物逻辑,而它同时也能告诉我们的一点是,这是哪个事物的状态(因为我们通过它知道的是一个具体事物的状态)。因此不同的事物对应不同的事物状态的话,我们可以通过TransactionStatus来唯一区分一个事物,也就是一个TransactionStatus就能唯一对应一个事物。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值