文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java Spring的两种事务是什么

2023-06-29 12:55

关注

本篇内容介绍了“Java Spring的两种事务是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1. Spring中的事务控制方式

Spring的事务控制可以分为编程式事务控制和声明式事务控制。

编程式

开发者直接把事务的代码和业务代码耦合到一起,在实际开发中不用。

声明式

开发者采用配置的方式来实现的事务控制,业务代码与事务代码实现解耦合,使用的AOP思想。

2.编程式事务控制相关对象

2.1PlatformTransactionManager

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

Java Spring的两种事务是什么

Java Spring的两种事务是什么

2.2TransactionDefinition

TransactionDefinition接口提供事务的定义信息(事务隔离级别、事务传播行为等等)

Java Spring的两种事务是什么

(1)事务隔离级别

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

注意:使用数据库默认级别,如果数据库是mysql,则默认是可重复读,oracle是读已提交。

ISOLATION_DEFAULT 使用数据库默认级别

ISOLATION_READ_UNCOMMITTED 读未提交

ISOLATION_READ_COMMITTED 读已提交(可解决脏读问题)

ISOLATION_REPEATABLE_READ 可重复读 (可解决脏读、不可重复读)

ISOLATION_SERIALIZABLE 串行化

可解决:

Java Spring的两种事务是什么

(2)事务传播行为

事务传播行为指的就是当一个业务方法【被】另一个业务方法调用时,应该如何进行事务控制。

Java Spring的两种事务是什么

重点:

Java Spring的两种事务是什么

2.3 TransactionStatus

TransactionStatus 接口提供的是事务具体的运行状态。

Java Spring的两种事务是什么

可以简单的理解三者的关系:事务管理器通过读取事务定义参数进行事务管理,然后会产生一系列的事务状态。

Spring中的事务控制主要就是通过这三个API实现的

PlatformTransactionManager 负责事务的管理,它是个接口,其子类负责具体工作

TransactionDefinition 定义了事务的一些相关参数

TransactionStatus 代表事务运行的一个实时状态

理解三者的关系:事务管理器通过读取事务定义参数进行事务管理,然后会产生一系列的事务状态

3.基于XML的声明式事务控制【重点】

在Spring配置文件中声明式的处理事务来代替代码式的处理事务。底层采用AOP思想来实现。

声明式事务控制明确事项:

核心业务代码(目标对象) (切入点是谁?)

事务增强代码(Spring已提供事务管理器))(通知是谁?)

切面配置(切面如何配置?)(切面 = 切入点 + 通知)

3.1快速入门

使用spring声明式事务控制转账业务。

步骤:

引入tx命名空间

事务管理器通知配置

事务管理器AOP配置

测试事务控制转账业务代码 

(1)引入tx命名空间
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:context="http://www.springframework.org/schema/context"       xmlns:tx="http://www.springframework.org/schema/tx"       xmlns:aop="http://www.springframework.org/schema/aop"       xsi:schemaLocation="       http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd       http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd">
(2)事务管理器通知配置
  <!--事务管理器对象-->    <!--<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property name="dataSource" ref="dataSource"/>    </bean>--> // 通知增强    <tx:advice id="txAdvice" transaction-manager="transactionManager">       //定义事务的一些属性 * 表示当前任意名称的方法都走默认配置     <!--            name: 切点方法名称            isolation:事务的隔离级别            propagation:事务的传播行为            read-only:是否只读            timeout:超时时间        -->        <tx:attributes>            <tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" timeout="-1"/>            //CRUD常用配置            <tx:method name="save*" propagation="REQUIRED"/>            <tx:method name="delete*" propagation="REQUIRED"/>            <tx:method name="update*" propagation="REQUIRED"/>            <tx:method name="find*" read-only="true"/>            <tx:method name="*"/>        </tx:attributes>    </tx:advice>
(3)事务管理器AOP配置 

当使用spring声明式管理事务,要使用aop:advisor来进行aop的配置!

//aop配置:配置切面   <aop:config>          <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.lagou.servlet.impl.AccountServiceImpl.*(..))"/>    </aop:config>-->

事务参数的配置详解:

<tx:method name=“transfer” isolation=“REPEATABLE_READ” propagation=“REQUIRED”timeout="-1" read-only=“false”/>

4.基于注解的声明式事务控制(重点)

步骤:

4.1 修改service层,增加事务注解

@Servicepublic class AccountServiceImpl implements AccountService {  @Autowired  private AccountDao accountDao;    @Transactional(propagation = Propagation.REQUIRED, isolation =Isolation.REPEATABLE_READ, timeout = -1, readOnly = false)  @Override  public void transfer(String outUser, String inUser, Double money) {    accountDao.out(outUser, money);    int i = 1 / 0;    accountDao.in(inUser, money); }}

4.2修改spring核心配置文件,开启事务注解支持

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://www.w2.org/2001/XMLSchema-instance"   xmlns:context="http://www.springframework.org/schema/context"   xmlns:aop="http://www.springframework.org/schema/aop"   xmlns:tx="http://www.springframework.org/schema/tx"   xsi:schemaLocation="   http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd   http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd   http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd   http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd">  <!--省略之前datsSource、jdbcTemplate、组件扫描配置-->  <!--事务管理器-->  <bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">    <property name="dataSource" ref="dataSource"></property>  </bean>  <!--事务的注解支持-->  <tx:annotation-driven/></beans

4.3纯注解方式

核心配置类:

@Configuration  // 声明该类为核心配置类@ComponentScan("com.lagou")  // 包扫描@Import(DataSourceConfig.class) //导入其他配置类@EnableTransactionManagement //事务的注解驱动public class SpringConfig {    @Bean    public JdbcTemplate getJdbcTemplate(@Autowired DataSource dataSource){        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);        return jdbcTemplate;    }    @Bean    public PlatformTransactionManager getPlatformTransactionManager(@Autowired DataSource dataSource){        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource);        return dataSourceTransactionManager;    }}

数据源配置类:

@PropertySource("classpath:jdbc.properties") //引入properties文件public class DataSourceConfig {    @Value("${jdbc.driverClassName}")    private String driver;    @Value("${jdbc.url}")    private String url;    @Value("${jdbc.username}")    private String username;    @Value("${jdbc.password}")    private String password;    @Bean //会把当前方法的返回值对象放进IOC容器中    public DataSource getDataSource(){        DruidDataSource druidDataSource = new DruidDataSource();        druidDataSource.setDriverClassName(driver);        druidDataSource.setUrl(url);        druidDataSource.setUsername(username);        druidDataSource.setPassword(password);        return druidDataSource;    }}

“Java Spring的两种事务是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯