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

购买一个网站需要多少钱?搜索引擎优化的方法与技巧

购买一个网站需要多少钱?,搜索引擎优化的方法与技巧,购买域名有什么用,东风南方实业集团 深圳vi设计公司文章目录 1. 基本概念2. 事务配置3. 事务的传播行为4. 转账(案例)4.1 准备工作4.2 代码实现 1. 基本概念 定义:事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或…

文章目录

  • 1. 基本概念
  • 2. 事务配置
  • 3. 事务的传播行为
  • 4. 转账(案例)
    • 4.1 准备工作
    • 4.2 代码实现

1. 基本概念

  • 定义:事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功,要么同时失败

  • Spring事务的作用:在数据层或业务层保障一系列的数据库操作同时成功或同时失败。

  • 事务的操作主要有三步:

    1. 开启事务(一组操作开始前,开启事务):start transaction / begin ;
    2. 提交事务(这组操作全部成功后,提交事务):commit ;
    3. 回滚事务(中间任何一个操作出现异常,回滚事务):rollback ;
  • Spring实现事务:Spring为了管理事务,提供了一个平台事务管理器PlatformTransactionManager

    在这里插入图片描述

PlatformTransactionManager只是一个接口,Spring还为其提供了一个具体的实现(DataSourceTransactionManager):我们只需要给它一个DataSource对象,它就可以帮你去在业务层管理事务。其内部采用的是JDBC的事务。所以说如果你持久层采用的是JDBC相关的技术,就可以采用这个事务管理器来管理你的事务。而Mybatis内部采用的就是JDBC的事务,所以后期我们Spring整合Mybatis就采用的这个DataSourceTransactionManager事务管理器。

在这里插入图片描述

  • 如何在代码中实现事务:Spring框架当中就已经把事务控制的代码都已经封装好了,并不需要我们手动实现。我们使用了Spring框架,我们只需要通过一个简单的注解@Transactional就搞定了。

    • @Transactional作用:就是在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作。

    • @Transactional注解:我们一般会在业务层当中来控制事务,因为在业务层当中,一个业务功能可能会包含多个数据访问的操作。在业务层来控制事务,我们就可以将多个数据访问操作控制在一个事务范围内。

    • @Transactional注解书写位置:

      • 方法
        • 当前方法交给Spring进行事务管理
        • 当前类中所有的方法都交由Spring进行事务管理
      • 接口
        • 接口下所有的实现类当中所有的方法都交给Spring进行事务管理

2. 事务配置

在这里插入图片描述

  • 上面这些属性都可以在@Transactional注解的参数上进行设置。

    • readOnly:true只读事务,false读写事务,增删改要设为false,查询设为true。
    • timeout:设置超时时间单位秒,在多长时间之内事务没有提交成功就自动回滚,-1表示不设置超时时间。
    • rollbackFor:当出现指定异常进行事务回滚。
    • noRollbackFor:当出现指定异常不进行事务回滚。
    • rollbackForClassName等同于rollbackFor,只不过属性为异常的类全名字符串。
    • noRollbackForClassName等同于noRollbackFor,只不过属性为异常的类全名字符串。
    • isolation设置事务的隔离级别:
      • DEFAULT:默认隔离级别, 会采用数据库的隔离级别
      • READ_UNCOMMITTED:读未提交
      • READ_COMMITTED: 读已提交
      • REPEATABLE_READ:重复读取
      • SERIALIZABLE: 串行化

    注意事项:Spring的事务只会对Error异常RuntimeException异常及其子类进行事务回顾,其他的异常类型是不会回滚的。

3. 事务的传播行为

在这里插入图片描述

  • 事务的传播行为:是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。

  • 我们要想控制事务的传播行为,在@Transactional注解的后面指定一个属性propagation,通过 propagation 属性来指定传播行为。接下来我们就来介绍一下常见的事务传播行为。

    属性值含义
    REQUIRED【默认值】需要事务,有则加入,无则创建新事务
    REQUIRES_NEW需要新事务,无论有无,总是创建新事务
    SUPPORTS支持事务,有则加入,无则在无事务状态中运行
    NOT_SUPPORTED不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
    MANDATORY必须有事务,否则抛异常
    NEVER必须没事务,否则抛异常

4. 转账(案例)

  • 需求:银行转账操作保证两个账户的金额变动要么都成功,要么都失败,并提供操作日志,并保存在数据表中,便于后期数据追踪。

    操作日志信息包含:

    • 转账人、收账人、金额、执行状态、转账时间。

4.1 准备工作

  1. 添加相关依赖:

    // Spring工程
    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.10.RELEASE</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version></dependency>
    </dependencies>
    
    // SpringBoot工程
    <dependencies><!--mybatis起步依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><!--mysql驱动--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>
    </dependencies>      
    
  2. 按需进行如下配置:

    Spring Boot 工程:无需手动添加 @EnableTransactionManagement,只要引入事务相关依赖(如 spring-boot-starter-jdbc),Spring Boot 会自动配置事务管理。

    传统 Spring 工程:必须显式添加 @EnableTransactionManagement 并在 XML 中配置事务管理器(如 <tx:annotation-driven/>

    @Configuration
    @ComponentScan("com.itheima")
    @PropertySource("classpath:jdbc.properties")
    @Import({JdbcConfig.class,MybatisConfig.class})
    @EnableTransactionManagement
    public class SpringConfig {}
    
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/spring_db?useSSL=false
    jdbc.username=root
    jdbc.password=root
    
    public class JdbcConfig {@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String userName;@Value("${jdbc.password}")private String password;@Beanpublic DataSource dataSource(){DruidDataSource ds = new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(password);return ds;}//配置事务管理器,mybatis使用的是jdbc事务@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource){DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();transactionManager.setDataSource(dataSource);return transactionManager;}
    }
    
    public class MybatisConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();ssfb.setTypeAliasesPackage("com.itheima.domain");ssfb.setDataSource(dataSource);return ssfb;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("com.itheima.dao");return msc;}
    }    
    

4.2 代码实现

  1. 数据库表结构(简略)

    -- 账户表
    CREATE TABLE account (id BIGINT PRIMARY KEY,balance DECIMAL(15,2) NOT NULL
    );-- 操作日志表
    CREATE TABLE transfer_log (id BIGINT AUTO_INCREMENT PRIMARY KEY,from_account BIGINT NOT NULL,to_account BIGINT NOT NULL,amount DECIMAL(15,2) NOT NULL,status VARCHAR(20) NOT NULL,create_time DATETIME NOT NULL
    );
    
  2. 核心代码分层设计

    1. Service 层 - 转账业务与日志分离:
    @Service
    public class TransferService {@Autowiredprivate AccountService accountService;@Autowiredprivate TransferLogService logService;// 外层事务:控制转账整体逻辑@Transactional(propagation = Propagation.REQUIRED)public void transfer(Long fromId, Long toId, BigDecimal amount) {// 1. 记录日志(独立事务:无论转账成功与否都记录尝试)logService.logAttempt(fromId, toId, amount);try {// 2. 执行转账(内层事务)accountService.transferFunds(fromId, toId, amount);// 3. 记录成功日志(独立事务)logService.logSuccess(fromId, toId, amount);} catch (Exception e) {// 4. 记录失败日志(独立事务)logService.logFailure(fromId, toId, amount, e.getMessage());throw e; // 抛出异常触发外层事务回滚}}
    }@Service
    public class AccountService {@Transactional(propagation = Propagation.MANDATORY) // 必须在外层事务中调用public void transferFunds(Long fromId, Long toId, BigDecimal amount) {// 扣减转出账户余额accountRepository.deduct(fromId, amount);// 增加转入账户余额accountRepository.add(toId, amount);}
    }@Service
    public class TransferLogService {// 独立事务:日志记录不受外层事务回滚影响@Transactional(propagation = Propagation.REQUIRES_NEW)public void logAttempt(Long fromId, Long toId, BigDecimal amount) {logRepository.save(new TransferLog(fromId, toId, amount, "ATTEMPT"));}@Transactional(propagation = Propagation.REQUIRES_NEW)public void logSuccess(...) { logRepository.save(new TransferLog(fromId, toId, amount, "Success"));}@Transactional(propagation = Propagation.REQUIRES_NEW)public void logFailure(...) { logRepository.save(new TransferLog(fromId, toId, amount, "Failure"));}
    }
    
    1. Repository 层(JPA 示例)

      public interface AccountRepository extends JpaRepository<Account, Long> {@Modifying@Query("UPDATE Account a SET a.balance = a.balance - :amount WHERE a.id = :id")void deduct(@Param("id") Long id, @Param("amount") BigDecimal amount);@Modifying@Query("UPDATE Account a SET a.balance = a.balance + :amount WHERE a.id = :id")void add(@Param("id") Long id, @Param("amount") BigDecimal amount);
      }public interface TransferLogRepository extends JpaRepository<TransferLog, Long> {}
      
http://www.dtcms.com/wzjs/114092.html

相关文章:

  • 哪个网站做医学培训好成都专业网站推广公司
  • 房产抵押贷款邯郸seo排名
  • wordpress1.0下载seo的定义
  • wordpress 被挂深圳优化网站方法
  • 英文网站建设成都百度开发者平台
  • 2017酷站推荐网站手机百度搜索
  • 电子商务网站建设 实验分析网站建设与优化
  • 常州建设银行网站实时排名软件
  • 办公管理系统aso优化的主要内容为
  • 做网站视频教学营销型网站建设哪家好
  • wordpress install.php空白页郑州好的seo外包公司
  • 建设银行龙卡信用卡在境外网站支付广告的六种广告形式
  • 做生意网站百度识图在线识图
  • 衡水网站建设公司联系电话网站建设方案内容
  • 有关做生态环境的官方网站腾讯企点注册
  • 怎么将dw做的网站导出app优化
  • php帝国建站系统站长工具的使用seo综合查询排名
  • 江诗丹顿手表网站搜索引擎优化的具体操作
  • 网站seo注意事项百度推广竞价排名
  • 狂人站群系统杭州关键词优化测试
  • 标准网站建设报价做网络推广有哪些平台
  • 海口网站建设公司排名襄阳百度开户
  • 深圳景观设计公司排行seoshanghai net
  • php动态网站开发交换链接营销的经典案例
  • 利用html5 监控网站性能东莞百度搜索优化
  • 哪些网站是做数据分析的抖音seo怎么做
  • 网站建设策划书模板seo基础理论
  • wordpress中文用户名注册优化网站推广网站
  • 宜昌做网站公司三明网站seo
  • 网站建设-选猴王网络优化设计单元测试卷答案