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

网站开发实用技术介绍网站推广软件免费版大全

网站开发实用技术介绍,网站推广软件免费版大全,菜单 标签 wordpress,定制手机号码官方网站编程式事务与声明式事务对比 数据库事务流程 Spring数据库事务约定流程 1. 编程式事务(Programmatic Transaction) 特点: 通过代码显式控制事务的开始、提交和回滚。灵活性高,适合复杂事务逻辑(如嵌套事务、动态事务…

编程式事务与声明式事务对比

数据库事务流程

在这里插入图片描述

Spring数据库事务约定流程

在这里插入图片描述


1. 编程式事务(Programmatic Transaction)

特点

  • 通过代码显式控制事务的开始、提交和回滚。
  • 灵活性高,适合复杂事务逻辑(如嵌套事务、动态事务边界)。
  • 代码侵入性较强。

使用示例
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Autowiredprivate TransactionTemplate transactionTemplate; // 1. 通过TransactionTemplate管理事务// 使用编程式事务public void createUserWithProgrammaticTransaction(User user) {transactionTemplate.execute(status -> { // 2. 执行事务操作try {userRepository.save(user); // 保存用户// 模拟业务逻辑,可能抛出异常if (user.getAge() < 0) {throw new RuntimeException("年龄不能为负数");}return null;} catch (Exception e) {status.setRollbackOnly(); // 3. 手动设置回滚throw e;}});}
}

关键点说明

  1. TransactionTemplate:通过依赖注入获取,需配置PlatformTransactionManager
  2. 事务逻辑封装:通过execute方法传入TransactionCallback,实现事务内的操作。
  3. 手动回滚:通过status.setRollbackOnly()控制回滚逻辑。


2. 声明式事务(Declarative Transaction)

特点

  • 通过注解(@Transactional)或XML声明事务属性,由Spring AOP自动管理。
  • 代码简洁,符合“关注点分离”原则。
  • 适合大多数标准事务场景(如方法级事务控制)。

使用示例
@Service
@Transactional // 1. 类级别声明事务
public class UserService {@Autowiredprivate UserRepository userRepository;// 方法级别覆盖事务配置@Transactional(propagation = Propagation.REQUIRES_NEW) // 2. 自定义传播行为public void createUserWithDeclarativeTransaction(User user) {userRepository.save(user); // 保存用户if (user.getAge() < 0) {throw new RuntimeException("年龄不能为负数"); // 3. 异常自动触发回滚}}
}

关键点说明

  1. @Transactional注解
    • 支持类或方法级别声明,默认事务传播行为为REQUIRED
    • 异常自动回滚:默认回滚RuntimeException及其子类,可通过rollbackFor自定义。
  2. 传播行为
    • REQUIRES_NEW:新事务,忽略外部事务。
    • REQUIRED:如果存在事务则加入,否则新建。


3. 核心配置

启用事务管理
// 启动类添加@EnableTransactionManagement
@SpringBootApplication
@EnableTransactionManagement // 必须开启声明式事务支持
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
数据源配置(application.properties)
# 自动配置DataSource和TransactionManager(需引入Spring Boot Starter Data JPA/MyBatis等)
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update


对比表格

对比项编程式事务声明式事务优缺点
实现方式通过代码显式控制事务(如TransactionTemplateTransactionManager)。通过注解(@Transactional)或XML声明事务属性,由Spring AOP代理管理。编程式:灵活性高,但代码冗余;
声明式:简洁,但需遵守Spring规则。
事务边界手动定义事务开始和结束(如execute方法)。通过注解标注方法或类,Spring自动管理边界。编程式适合动态边界;声明式适合固定方法级控制。
回滚控制手动调用setRollbackOnly()或抛出异常触发回滚。默认基于异常类型回滚(如RuntimeException),可通过rollbackFor自定义。编程式更灵活;声明式需依赖注解配置。
传播行为通过Propagation枚举显式设置。通过@Transactional(propagation=...)声明。声明式配置更直观。
代码侵入性需嵌套事务逻辑代码,侵入性强。通过注解声明,几乎无侵入。声明式更符合“关注点分离”原则。
适用场景复杂事务逻辑(如嵌套事务、动态事务)、需精细控制事务生命周期的场景。标准事务场景(如单方法事务)、需快速实现事务管理的场景。声明式适合大多数业务;编程式用于特殊需求。
配置复杂度需注入TransactionTemplateTransactionManager,手动编写事务逻辑。仅需注解和启用@EnableTransactionManagement声明式配置简单,编程式需更多代码。

总结

选择建议
  1. 声明式事务(首选)

    • 适用于大多数标准场景,如方法级事务控制。
    • 示例:用户注册、订单提交等单方法事务。
  2. 编程式事务

    • 适用于需要复杂事务逻辑的场景,如:
      • 嵌套事务(REQUIRES_NEW需与外部事务隔离)。
      • 动态决定是否回滚(如根据业务状态而非异常)。
关键注意事项
  • Spring Boot自动配置:确保引入spring-boot-starter-data-jpaspring-boot-starter-mybatis-plus等依赖,自动配置DataSourceTransactionManager
  • 事务代理机制:声明式事务依赖Spring AOP代理,需注意以下问题:
    • 方法可见性@Transactional仅对公共方法生效,内部方法调用无法触发事务。
    • 代理类型:默认使用JDK动态代理,需接口;若需CGLIB代理,可添加@EnableAspectJAutoProxy(proxyTargetClass = true)

完整代码示例

1. 编程式事务完整代码
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Autowiredprivate PlatformTransactionManager transactionManager; // 1. 注入事务管理器public void createUserWithProgrammatic() {DefaultTransactionDefinition def = new DefaultTransactionDefinition();TransactionStatus status = transactionManager.getTransaction(def); // 2. 开启事务try {userRepository.save(new User("张三", 25)); // 保存用户// 模拟业务逻辑,抛出异常if (true) {throw new RuntimeException("模拟业务异常");}transactionManager.commit(status); // 3. 提交事务} catch (Exception e) {transactionManager.rollback(status); // 4. 手动回滚throw e;}}
}
2. 声明式事务完整代码
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactional(rollbackFor = Exception.class) // 1. 声明事务,包含所有异常回滚public void createUserWithDeclarative() {userRepository.save(new User("李四", 30)); // 保存用户if (true) {throw new RuntimeException("模拟业务异常"); // 2. 触发自动回滚}}
}

核心配置代码

// 启动类
@SpringBootApplication
@EnableTransactionManagement // 2. 启用声明式事务
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
# application.properties
# 1. 数据源配置(Spring Boot自动配置TransactionManager)
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update

最终对比总结

方式推荐程度适用场景代码简洁性灵活性
编程式事务复杂事务逻辑(嵌套、动态控制)
声明式事务标准事务场景(方法级控制)

结论

  • 优先选择声明式事务,简洁且符合设计模式。
  • 仅在需要复杂控制时(如嵌套事务、动态回滚条件)使用编程式事务。
http://www.dtcms.com/wzjs/153489.html

相关文章:

  • 企业准备做网站的准备工作关键词推广怎么做
  • 做网站导航多大字号湖南网站营销seo多少费用
  • 图书馆 网站开发 总结专业seo培训学校
  • 购物网站logo站长工具seo排名
  • 英文站网站源码seo技术专员招聘
  • 金华网站开发公司长沙网站推广公司排名
  • 成都大型网站建设网站排名首页前三位
  • 徐州好点的做网站的公司有哪些竞价推广平台有哪些
  • 建设一个网站需要什么硬件成都专业网站推广公司
  • 手机网页无法访问厦门百度seo公司
  • 可以做拟合的在线网站电脑软件推广平台
  • 河南工程建设信息网站惠州seo外包公司
  • 有些人做网站不用钱的,对吗?百度链接提交工具
  • jsp做的网站怎嘛用收录优美的图片app
  • 河北企业网站建设公司爱站权重
  • wordpress去做关键词优化
  • 三角网站建设昆明网络营销公司哪家比较好
  • 天津住房与城乡建设委员会网站百度app下载安装 官方
  • 给网站做数据分析温州seo品牌优化软件
  • 安全员怎么网站中做备案寻找客户的渠道和方法
  • 网站别人备案怎么办理专业优化网站排名
  • 小说网站做编辑网站推广在线推广
  • 新疆生产建设兵团司法局网站seo外包公司
  • 地推任务网杭州seo价格
  • 天门建站网络服务商
  • 银川迅雷网站建设电商运营推广是做什么的
  • 全球优秀网页设计机构长沙网站推广和优化
  • 7个优秀网站设计赏析知乎关键词排名
  • 做年报的网站百度竞价排名又叫什么
  • 礼品网站建设免费制作链接