mybatis 的事务管理
MyBatis 提供了内置的事务管理器,主要包括以下两种事务管理方式:
JDBC 事务管理:直接使用 JDBC 的 commit 和 rollback 方法进行事务控制。
MANAGED 事务管理:适用于容器(如 Spring)托管事务,MyBatis 不会自己处理事务,而是交由容器来管理。
MANAGED 事务管理(Spring )
MANAGED
事务管理器通常用于与 Java EE 容器(如 JBoss、WebSphere)集成,或使用 Spring 来管理事务。在这种模式下,事务由容器或外部框架管理,MyBatis 本身不处理事务的 commit
和 rollback
。
手动事务管
当不使用 Spring 等框架时,可以手动控制 MyBatis 的事务。手动管理事务通常需要通过 SqlSession
(JDBC )来管理,SqlSession
提供了 commit()
和 rollback()
方法,用于提交和回滚事务。
Spring管理 (声明式事物管理)
通过 Spring 的声明式事务管理,开发者可以通过注解来管理事务。只需在需要管理事务的方法上添加 @Transactional
注解,Spring 会自动管理事务的提交和回滚。若异常则执行 运行时异常 RuntimeException
**propagation
**控制事务的传播行为 常用参数:REQUIRED , REQUIRES_NEW , SUPPORTS
**isolation
**控制事务的隔离级别,常见的有 READ_COMMITTED , SERIALIZABLE
rollbackFor
控制哪些异常会触发事物回滚
事务的隔离级别
READ_UNCOMMITTED:事务可以读取未提交的数据,可能导致脏读。
READ_COMMITTED:只能读取已经提交的数据,防止脏读。
REPEATABLE_READ:事务开始后看到的数据是一致的,即使其他事务提交了数据,防止不可重复读。
SERIALIZABLE:最高的隔离级别,事务完全串行化执行,防止幻读。
事务的传播行为
传播行为定义了一个事务如何与其他事务交互,常见的传播行为包括:
REQUIRED:如果当前没有事务,创建一个新事务;如果已经存在事务,加入该事务。
REQUIRES_NEW:每次都会创建一个新事务,当前事务暂停。
NESTED:支持嵌套事务,外层事务回滚时,内层事务也会回滚。
MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
NEVER: 以非事务方式执行,如果当前存在事务,则抛出异常。
NESTED: 如果当前存在事务,则在当前事务中开启一个嵌套事务(逻辑上的嵌套,在不同数据库中的实现方式可能不同)。嵌套事务在提交或回滚时与外层事务有一定的关联。一般情况下,外层事务提交成功后,嵌套事务才会真正提交;如果嵌套事务回滚,外层事务可以选择继续执行或者一起回滚。