【SSM直击大厂】第十一章:Spring 事务控制

作者主页:求不脱发的博客

精选专栏:SSM直击大厂

精彩摘要:在实际开发中,操作数据库时都会涉及到 事务管理 问题,为此 Spring 提供了专门用于 事务 处理的API。 Spring 的 事务管理 简化了传统的 事务管理 流程,并且在一定程度上减少了开发者的工作量。

觉得文章还不错的话欢迎大家点赞➕收藏⭐️➕评论支持博主


目录

Spring 事务控制

编程式事务控制三大对象

1️⃣PlatformTransactionManager

2️⃣ TransactionDefinition

3️⃣ TransactionStatus

4️⃣本节小结

基于 XML 的声明式事务控制

1️⃣什么是声明式事务控制?

2️⃣基于XML的声明式事务控制快速入门:

3️⃣切点方法的事务参数的配置

4️⃣本节小结

基于注解的声明式事务控制

1️⃣使用注解配置声明式事务控制快速入门

2️⃣注解配置声明式事务控制注意事项

3️⃣本节小结

本章小结


Spring 事务控制

什么是事务控制?为什么要使用事务控制?

        在许多大型、关键的应用程序中,计算机每秒钟都在执行大量的任务。更为经常的不是这些任务本身,而是将这些任务结合在一起完成一个业务要求,称为事务。如果能成功地执行一个任务,而在第二个或第三个相关的任务中出现错误,将会发生什么?这个错误很可能使系统处于不一致状态。这时事务变得非常重要,它能使系统摆脱这种不一致的状态。

        例如在实际开发中,操作数据库时都会涉及到 事务管理 问题。在银行转账时,A要给B转账5000¥,首先A账户-5000¥,但是在B账户收到这5000¥之前,可能会发生某种意外导致此次操作没有完成。这是意外便发生了。这是,事务控制就显得尤为重要。

        为此 Spring 提供了专门用于 事务 处理的API。 Spring 的 事务管理 简化了传统的 事务管理 流程,并且在一定程度上减少了开发者的工作量。


编程式事务控制三大对象

1️⃣PlatformTransactionManager

        PlatformTransactionManager 接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法。

方法 说明
TransactionStatus getTransaction(TransactionDefination defination) 获取事务的状态信息
void commit(TransactionStatus status) 提交事务
void rollback(TransactionStatus status) 回滚事务

注意: PlatformTransactionManager 是接口类型,不同的 Dao 层技术则有不同的实现类。

例如:

        Dao 层技术是jdbc 或 mybatis 时: 使用 org.springframework.jdbc.datasource.DataSourceTransactionManager

        Dao 层技术是hibernate时:使用org.springframework.orm.hibernate5.HibernateTransactionManager

2️⃣ TransactionDefinition

TransactionDefinition 是事务的定义信息对象,里面有如下方法:

方法 说明
int getIsolationLevel() 事务的隔离级别
int getPropogationBehavior() 事务的传播行为
int getTimeout() 超时时间
boolean isReadOnly() 是否只读

2.1 设置事务隔离级别

设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读。 

ISOLATION_DEFAULT      默认
ISOLATION_READ_UNCOMMITTED  读未提交
ISOLATION_READ_COMMITTED 读已提交
ISOLATION_REPEATABLE_READ  可重复读
ISOLATION_SERIALIZABLE 可序列化

2.2 设置事务传播行为

  • REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)。
  • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事
  • MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常
  • REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。
  • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
  • NEVER:以非事务方式运行,如果当前存在事务,抛出异常
  • NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 REQUIRED 类似的操作
  • 超时时间:默认值是-1,没有超时限制。如果有,以秒为单位进行设置
  • 是否只读:建议查询时设置为只读

3️⃣ TransactionStatus

TransactionStatus 接口提供的是事务具体的运行状态,方法介绍如下。

方法 说明
boolean hasSavepoint() 是否存储回滚点
boolean isCompleted() 事务是否完成
boolean isNewTransaction() 是否是新事务
boolean isRollbackOnly() 事务是否回滚

4️⃣本节小结

编程式事务控制三大对象

对象 说明
PlatformTransactionManager 事务管理器  提供常用操作事务的法。
TransactionDefinition 事务的定义信息对象
TransactionStatus 事务具体的运行状态

 


基于 XML 的声明式事务控制

1️⃣什么是声明式事务控制?

        Spring 的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中声明 ,用在 Spring 配置文件中声明式的处理事务来代替代码式的处理事务。

        事务管理不侵入开发的组件。具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如 此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话, 也只需要在定义文件中重新配置即可。

        在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译 ,这样维护起来极其方便。

注意:Spring 声明式事务控制底层就是AOP。


2️⃣基于XML的声明式事务控制快速入门:

① 在 applicationContext.xml 中引入tx命名空间

② 配置事务增强



    



    
        
    

③ 配置事务 AOP 织入



    
    

④ 织入成功,测试事务控制


3️⃣切点方法的事务参数的配置



    
        
    

其中, 代表切点方法的事务参数的配置,例如:


  • name:切点方法名称
  • isolation:事务的隔离级别
  • propogation:事务的传播行为
  • timeout:超时时间
  • read-only:是否只读

4️⃣本节小结

基于XML的声明式事务控制快速入门:

  1.  平台事务管理器配置
  2. 事务通知的配置
  3. 事务aop织入的配置

基于注解的声明式事务控制

1️⃣使用注解配置声明式事务控制快速入门

① 编写 AccoutDao

@Repository("accountDao")
public class AccountDaoImpl implements AccountDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    //outMan账户转出money元
    public void out(String outMan, double money) {
        jdbcTemplate.update("update account set money=money-? where name=?",money,outMan);
    }

    //inMan转入money元
    public void in(String inMan, double money) {
        jdbcTemplate.update("update account set money=money+? where name=?",money,inMan);
    }
}

② 编写 AccoutService

@Service("accountService")
@Transactional
public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountDao accountDao;

    @Transactional(isolation = Isolation.READ_COMMITTED,propagation =
Propagation.REQUIRED)
    //实现转账操作   outMan向inMan转入money元
    public void transfer(String outMan, String inMan, double money) {
        accountDao.out(outMan,money);
        accountDao.in(inMan,money);
    }
}

③ 配置applicationContext.xml 配置文件







2️⃣注解配置声明式事务控制注意事项

  • 使用 @Transactional 在需要进行事务控制的类或方法上修饰,注解可用的属性同 xml 配置方式,例如隔离级别、传播行为等。
  • 注解使用在类上,那么该类下的所有方法都使用同一套注解参数配置。 
  • 使用在方法上,不同的方法可以采用不同的事务参数配置。 
  • Xml配置文件中要开启事务的注解驱动。

3️⃣本节小结

注解声明式事务控制的配置 快速入门:

  1. 平台事务管理器配置(xml方式)
  2. 事务通知的配置(@Transactional注解配置)
  3. 事务注解驱动的配置

本章小结

1️⃣编程式事务控制三大对象

对象 说明
PlatformTransactionManager 事务管理器  提供常用操作事务的法。
TransactionDefinition 事务的定义信息对象
TransactionStatus 事务具体的运行状态

2️⃣基于XML的声明式事务控制快速入门:

  1.  平台事务管理器配置
  2. 事务通知的配置
  3. 事务aop织入的配置

 3️⃣注解声明式事务控制的配置 快速入门:

  1. 平台事务管理器配置(xml方式)
  2. 事务通知的配置(@Transactional注解配置)
  3. 事务注解驱动的配置

 

 

你可能感兴趣的:(Spring,spring,java,mvc,maven,前端框架)