Spring 中事务属性详解

    科技2024-03-10  77

    Spring 中事务属性详解

    Isolation 指定事务的隔离级别

    读已提交 READ_COMMITTED读未提交 READ_UNCOMMITTED可重复读 REPEATABLE_READ串行化 SERIALIZABLE默认值 DEFAULT: (MySQL: 可重复读、Oracle: 读已提交)

    timeout 设置单位为秒的超时。 默认值是 -1 表示使用数据库的设置。

    readOnly 设置是否是只读事务。

    当你能确保整个事务过程中只对数据库执行Select操作的时候,如果将此属性设置为true,则会自动进行优化,提高性能。

    Propagation 事务的传播属性(特有的精细化的控制),解决的是事务嵌套的问题

    SUPPORTS(1), //支持 Support a current transaction, execute non-transactionally if none exists. 支持当前事务,如果当前没事务,则在非事务的环境下执行。 MANDATORY(2), //强制要求 Support a current transaction, throw an exception if none exists. 支持当前事务,如果当前没事务则抛出异常。 NOT_SUPPORTED(4), //不支持 Execute non-transactionally, suspend the current transaction if one exists. 在非事务的环境下执行,如果当前存在事务,则挂起当前事务。 NEVER(5), //从不使用 Execute non-transactionally, throw an exception if a transaction exists. 在非事务的环境下执行,如果当前存在事务,则抛出异常。 REQUIRES_NEW(3), //要求新的 Create a new transaction, and suspend the current transaction if one exists. 总是创建一个新的事务,如果当前有事务则挂起当前事务。 REQUIRED(0), //要求 Support a current transaction, create a new one if none exists. 如果当前有事务则使用当前事务,否则创建新的事务。 NESTED(6); //嵌套 Execute within a nested transaction if a current transaction exists, behave like REQUIRED otherwise. 如果当前有事务,则在当前事务的嵌套事务中执行。否则,创建新的事务执行。 嵌套事务的特点: 内层事务的回滚,不会影响外层事务。 但是,外层事务的回滚,会影响内层事务。

    1.事务传播属性

    propagation: 传播

    REQUIRED: 需要事务,外部存在事务融入当前事务,外部没有事务,开启新的事务 SUPPORTS: 支持事务,外部存在事务融入当前事务,外部没有事务,不开启新的事务 REQUIRES_NEW: 每次开启新的事务,如果外部存在事务外部事务挂起,开启新的事务运行,运行结束后回复外部事务 NOT_SUPPORTED: 不支持事务,如果外部存在事务外部事务挂起,已非事务方式运行. NEVER: 不支持事务,存在事务报错 MANDATORY: 强制事务没有事务报错 NESTED: 嵌套事务,数据库不支持

    2.事务的隔离级别

    isolation 隔离级别

    DEFAULT: 采用数据库默认隔离级别 READ_UNCOMMITTED: 读未提交 READ_COMMITTED: 读提交 用来避免脏读现象出现的 oracle默认隔离级别 REPEATABLE_READ: 可重复读主要是用来避免不可重复读现象出现的 (在一次事务中一方更新,导致两次查询结果不一致这种情况叫不可重复读) mysql默认隔离级别 SERIALIZABLE : 序列化读 用来避免幻影读现象出现 (在一次事务中一方插入,导致两次查询结果不一致这种情况叫幻影读)

    3.读写和异常性

    readonly

    true: 本次事务只读false: 本次事务非只读 <tx:method name=“save*” propagation=“REQUIRES_NEW” read-only=“true|false” isolation=“SERIALIZABLE”/>

    rollback-for && no-rollback-for=""

    rollback-for: 遇到什么类异常回滚 no-rollback-for: 遇到什么类异常不回滚 <tx:method name="save*" rollback-for="" no-rollback-for="" propagation="REQUIRES_NEW" read-only="true" isolation="SERIALIZABLE"/>

    timeout 超时性

    timeout: -1 永不超时

    InitializingBean接口

    Spring内部的接口。

    public interface InitializingBean { void afterPropertiesSet() throws Exception; }

    当一个注册到Spring容器中的Bean,实现了此接口以后。那么,Spring 容器创建完该对象,并设置好相关属性(DI)以后,会自动调用其 afterPropertiesSet 方法(相当于一个出厂时的质检环节,在这个方法里面可以写一些检查逻辑。比如:检查某些关键依赖是否已经被注入)。

    Processed: 0.010, SQL: 8