事务的特性及生效条件

194 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

一、什么是事务

事务是逻辑上的一组完整的操作,要么都执行,要么都不执行,前后必须保持一致。 事务属性可以理解成事务的一些基本配置,描述了事务策略如何应用到方法上。事务属性包含了5个方面:隔离级别、传播行为、回滚规则、是否只读、事务超时。TransactionDefinition 接口中定义了 5 个方法属性。

二、事务的特性ACID

  • A-原子性:一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。

  • C-一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。

  • I-隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括未提交读(Read uncommitted)、已提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。

  • D-持久性:事务处理结束后,对数据的修改是永久的,即便系统故障也不会丢失。

事务的原子性、隔离性、持久性最终都是为了达到一致性

三、事务生效的条件

需要注意的是:1、事务能否生效数据库引擎是否支持事务是关键。比如常用的 MySQL 数据库默认使用支持事务的 innodb引擎。但是,如果把数据库引擎变为 myisam,那么程序也就不再支持事务了!

2、同类中非事务方法调用事务方法,不生效。

3、Transactional注解标注方法修饰符为非public时不生效。

4、事务方法内部捕捉了异常,没有抛出新的异常,导致事务操作不会进行回滚。

四、事务管理器接口PlatformTransactionManager

1、事务管理器接口有以下几个接口,获取事务信息,提交和回滚

public interface PlatformTransactionManager {
    TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;

    void commit(TransactionStatus var1) throws TransactionException;

    void rollback(TransactionStatus var1) throws TransactionException;
}

2、常见的事务管理器

这些管理器都实现了PlatformTransactionManager中的三个接口,实现逻辑略有差别,但是对用户来讲区别不大。

  • DataSourceTransactionManager
  • HibernateTransactionManager
  • JtaTransactionManager