Spring的事务管理机制

PlatformTransactionManager事务管理器

参考:spring-framework-4.2.4.RELEASE/docs/javadoc-api/index.html

Spring的事务管理机制_第1张图片
该接口提供三个方法:

  • commit:提交事务
  • rollback:回滚事务
  • getTransaction:获取事务状态

Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现:
Spring的事务管理机制_第2张图片
Spring的事务管理机制_第3张图片

DataSourceTransactionManager针对JdbcTemplate、MyBatis 事务控制 ,使用Connection(连接)进行事务控制 :
开启事务 connection.setAutoCommit(false);
提交事务 connection.commit();
回滚事务 connection.rollback();

事务管理器的选择?
用户根据选择和使用的持久层技术,来选择对应的事务管理器。

TransactionDefinition事务定义信息

用来定义事务相关的属性的,给事务管理器用。

参考:spring-framework-4.2.4.RELEASE/docs/javadoc-api/index.html

Spring的事务管理机制_第4张图片
该接口主要提供的方法:

  • getIsolationLevel:隔离级别获取
  • getPropagationBehavior:传播行为获取
  • getTimeout:获取超时时间(事务的有效期)
  • isReadOnly 是否只读(保存、更新、删除—对数据进行操作-变成可读写的,查询-设置这个属性为true,只能读不能写),事务管理器能够根据这个返回值进行优化。

这些事务的定义信息,都可以在配置文件中配置和定制。

事务的隔离级别IsolationLevel

Spring的事务管理机制_第5张图片

脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的。

不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的更新数据。相反,“可重复读”在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。

幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录。

事务四大特性 ACID —隔离性引发问题 ---- 解决事务的隔离问题 隔离级别
Mysql 默认隔离级别 REPEATABLE_READ
Oracle 默认隔离级别 READ_COMMITTED

事务的传播行为PropagationBehavior

什么是事务的传播行为? 有什么作用?

事务传播行为用于解决两个被事务管理的方法互相调用问题

Spring的事务管理机制_第6张图片
业务层两个方法面临的事务问题:

  • 有些时候需要处于同一个事务(删除用户删除完成之后,需要同时删除用户对应的订单,需要事务回滚,例如商场工作人员删除订单业务),
  • 有些时候不能在同一个事务(取款是一个事务操作,打印凭条是一个事务操作,例如ATM取款业务) !

事务的传播行为的7种类型:
在这里插入图片描述
Spring的事务管理机制_第7张图片

TransactionStatus 事务状态

Spring的事务管理机制_第8张图片
flush(),给hibernate使用,底层发出sql的
hasSavepoint():判断是否有保留点
isCompleted():判断事务是否结束
isNewTransaction():判断当前事务是否是新开的一个事务。
isRollbackOnly():判断事务是否只能回滚
setRollbackOnly():设置事务是否回滚

Spring事务管理两种方式

Spring 支持两种方式事务管理

一:编程式的事务管理

通过TransactionTemplate手动管理事务
在实际应用中很少使用,原因是要修改原来的代码,加入事务管理代码 (侵入性 )
参考文档:http://www.yiibai.com/spring/programmatic_management.html
Spring的事务管理机制_第9张图片

二:使用XML或注解配置声明式事务

  • Spring的声明式事务是通过AOP实现的(环绕通知)
  • 开发中经常使用(代码侵入性最小)--推荐使用!

你可能感兴趣的:(spring,mybatis,java)