当前位置: 首页 > news >正文

Spring——声明式事务

目录

声明式事务的实现方式

XML配置

配置类配置

混合配置


  Spring声明式基于AOP实现,是通过配置注解xml来管理事务,而不需要在业务代码中像编程式事务那样管理代码。

特性编程式事务声明式事务
代码侵入性强,事务代码与业务代码混合弱,通过配置或注解,代码几乎无侵入
控制粒度细粒度,可以精确控制事务边界粗粒度,通常作用于方法级别
灵活性高,可以根据条件动态控制事务相对较低,配置固定,但可通过条件表达式等增强
可维护性低,事务代码分散在业务代码中高,事务配置集中管理
实现方式编写代码,使用PlatformTransactionManagerTransactionTemplate使用注解(如@Transactional)或XML配置
底层技术直接使用事务API基于Spring AOP和代理机制

声明式事务的实现方式

    声明式事务可以通过XML或注解配置,也可以混合使用。

XML配置

    xml配置声明式有三个步骤:

  1. 配置事务管理器
  2. 配置事务通知
  3. 配置AOP

配置事务管理器

<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager"><property name="dataSource" ref="dataSource"/>
</bean>

配置事务通知

配置说明:

  1. 事务通知(tx:advice)

    • id="txAdvice":事务通知的唯一标识
    • transaction-manager="transactionManager":关联前面定义的事务管理器
  2. 事务属性(tx:attributes)通过<tx:method>定义不同方法的事务规则,支持通配符匹配方法名:

    • name:方法名匹配规则(如save*匹配所有以 save 开头的方法)
    • propagation:事务传播行为(核心属性)
      • REQUIRED:默认值,当前无事务则新建,有则加入
      • REQUIRES_NEW:强制新建事务,暂停当前事务(若存在)
      • SUPPORTS:支持事务,无事务则非事务执行
    • isolation:事务隔离级别(默认DEFAULT,使用数据库默认)
    • read-only:是否只读(查询方法设为true,优化性能)
    • rollback-for:指定需要回滚的异常(默认仅回滚 RuntimeException)
    • timeout:事务超时时间(-1 表示无限制)
    <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes><tx:method name="add*"/><tx:method name="update*"/><tx:method name="delete*"/><tx:method name="insert*"/><tx:method name="transfer*"/></tx:attributes></tx:advice>

配置AOP:

    <aop:config><aop:pointcut expression="execution(* com.cc.service.*.*(..))" id="pc"/><aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/></aop:config>

然后编写方法,注意方法名要和配置的方法名对应

public void update2(){userDao.updateUsernameById(1,"ng");int i = 1/0;}

这样调用该方法,抛异常时就会自动回滚。

配置类配置

    首先写一个java配置类来代替spring的配置文件,里面包含了定义事务管理器和mybatis配置:

@Configuration
@ComponentScan("com.cc")
@EnableTransactionManagement
@MapperScan("com.cc.dao")
public class JavaConfig {@BeanDataSource dataSource(){DriverManagerDataSource ds = new DriverManagerDataSource();ds.setDriverClassName("com.mysql.cj.jdbc.Driver");ds.setUrl("jdbc:mysql://localhost:3306/shop-user");ds.setUsername("root");ds.setPassword("123456");return ds;}@BeanPlatformTransactionManager transactionManager(){return new DataSourceTransactionManager(dataSource());}@Beanpublic SqlSessionFactory sqlSessionFactory() throws Exception {SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(dataSource());return sessionFactory.getObject();}}

    接着在业务方法上面加上注解@Transactional,

@Transactional
public void tr(){userDao.updateUsernameById(1,"ng1n");int i = 1/0;
}

    然后用一个main方法区调用,发现事务自动回滚:

    public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);UserService2 bean = context.getBean(UserService2.class);bean.tr();}

混合配置

    混合配置使用xml+注解的方式,无需使用配置类

XML中的配置:

<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/shop-user"/><property name="username" value="root"/><property name="password" value="123456"/>
</bean><bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory"><property name="dataSource" ref="dataSource"></property>
</bean><bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager"><property name="dataSource" ref="dataSource"/>
</bean><!-- 开启注解式事务支持-->
<tx:annotation-driven/>

后面直接使用@Transactional注解即可。

http://www.dtcms.com/a/438907.html

相关文章:

  • 【Go 语言】揭秘 Go 语言的并发魔法:Goroutine 入门指南
  • 工商企业信息查询网站深圳宝安龙岗紧急寻人
  • 怎么上传视频到公司网站西安seo排名扣费
  • cms(网站内容管理系统)有哪些商业信息网站大全
  • Redis面试题及详细答案100道(86-100) --- 综合篇
  • 贪心算法:原理与实战全解析
  • python评估算法性能
  • 408之cpp(二叉树的广度优先遍历)
  • 保定市网站销售和设计中国各大网站开发语言
  • 本地常州微信网站建设做网站税率
  • 网页设计 做网站的代码公司网站开发项目管理制度
  • EFlat-LoRA 的严格数学推导
  • 【面板数据】全国分省教育支出水平数据集(2007-2023年)
  • 做网站工商局要不要备案呢wordpress主题多页面
  • 济南网站建设服务公司wordpress 远程插件安装 ftp
  • 济南网站建设公司按需定制保险网站建设的目标
  • 深入剖析:boost::intrusive_ptr 与 std::shared_ptr 的性能边界和实现哲学
  • 聊城制作手机网站公司网站建设需要的条件
  • SQL 子查询与多表 JOIN 用法大全(速查版)
  • Leetcode 239. 滑动窗口最大值 优先队列 / 双向单调队列
  • Nacos 工作原理及流量走向
  • 夏津网站建设茂名企业建站程序
  • OSPF 单区域实验 概念及题目
  • 建立一个门户网站WordPress域名后问号英文
  • 自上而下VS自下而上:设计哲学全解
  • 【开题答辩全过程】以 SpringCloud家乡美旅行交流博客平台为例,包含答辩的问题和答案
  • 2015优先中文公司官网wordpress模板
  • 国外优秀企业网站网络空间的竞争归根结底是
  • 哪些外贸网站可以做soho求网站2021给个网址
  • 2022年网站能用的兰州企业网站制作