声明式事务

文章目录

    • 1.事务分类
        • 1.传统方式解决事务
        • 2.声明式事务
    • 2.声明式事务案例
        • 1.需求分析
        • 2.解决方案分析
        • 3.数据表创建
        • 4.编写GoodsDao.java
          • 1.编写配置文件JdbcTemplate_ioc.xml
          • 2.单元测试
        • 5.编写GoodsService.java
        • 6.配置事务管理器JdbcTemplate_ioc.xml
        • 7.进行测试
    • 3.debug事务管理器DataSourceTransactionManager
        • 1.基本步骤解释
          • 1.配置文件
          • 2.注解
          • 3.具体AOP示意图
        • 2.debug出现异常情况
          • 1.下断点
          • 2.执行
          • 3.下一个断点
          • 4.再打一个断点,跳过去
          • 5.下一个断点
          • 6.在con.rollback();打一个断点,跳过去然后下一步
    • 4.声明式事务传播机制
        • 1.基本介绍
        • 2.事务传播机制种类
        • 3.图解
          • 1.默认事务传播机制(REQUIRED)
          • 2.REQUIRES_NEW事务传播机制
          • 3.两种事务传播机制的区别
        • 4.声明式事务传播机制的设置方法
        • 5.应用实例
          • 1.文件目录
          • 2.GoodsDao.java
          • 3.GoodsService.java
          • 4.MultiplyService.java
          • 5.默认传播机制测试
            • 1.故意修改GoodsDao.java第一套的updateBalance方法
            • 2.初始数据表
            • 3.测试代码
            • 4.结果展示
          • 6.REQUIRES_NEW传播机制演示
            • 1.故意修改GoodsDao.java第二套的updateBalance方法(第一套的改回来)
            • 2.修改GoodsService.java的两个事务传播机制
            • 3.修改MultiplyService.java的一个事务传播机制
            • 4.初始数据表
            • 5.测试代码
            • 6.结果展示
            • 7.注意事项
    • 5.事务隔离级别
        • 1.基本介绍
        • 2.应用实例
          • 1.简要介绍
          • 2.结果展示
            • 1.原goods表
            • 2.启动测试程序
            • 3.修改id为1的价格
            • 4.打开断点,查看第二次结果
        • 3.修改事务隔离级别
    • 6.事务超时回滚
        • 1.基本介绍
        • 2.代码实例
          • 1.GoodsService.java的buyGoodsByTxSOLATION方法
          • 2.测试程序
          • 3.原账户表
          • 4.执行测试程序
    • 7.课后练习
        • 1.要求
        • 2.数据表设计
        • 3.代码实现
          • 1.文件目录
          • 2.jdbc.properties
          • 3.txhomework.xml
          • 4.HomeWorkDao.java
          • 5.HomeWorkService.java
          • 6.测试类
          • 7.原数据表
          • 8.执行测试类
            • 1.执行失败
            • 2.执行成功

1.事务分类

1.传统方式解决事务

image-20240223103145604

2.声明式事务

2.声明式事务案例

1.需求分析

image-20240223103404559

2.解决方案分析

image-20240223103746418

image-20240223103759610

3.数据表创建
-- 声明式事务要创建的表-- 账户表
CREATE TABLE `user_account`(
user_id INT UNSIGNED PRIMARY KEY auto_increment,
user_name VARCHAR(32) NOT NULL DEFAULT'',
money DOUBLE NOT NULL DEFAULT 0.0
);
INSERT INTO `user_account` VALUES(NULL, '张三', 1000);
INSERT INTO `user_account` VALUES(NULL, '李四', 2000);SELECT * FROM user_account;-- 商品表
CREATE TABLE `goods`(
goods_id INT UNSIGNED PRIMARY KEY auto_increment,
goods_name VARCHAR(32) NOT NULL DEFAULT'',
price DOUBLE NOT NULL DEFAULT 0.0
);
INSERT INTO goods VALUES(NULL, '小风扇',10.00);
INSERT INTO goods VALUES(NULL, '小台灯',12.00);
INSERT INTO goods VALUES(NULL, '可口可乐',1.00);SELECT * FROM goods;-- 商品库存表
CREATE TABLE `goods_amount`(
goods_id INT UNSIGNED PRIMARY KEY auto_increment,
goods_num INT UNSIGNED DEFAULT 0
);
INSERT INTO goods_amount VALUES(NULL, 200);
INSERT INTO goods_amount VALUES(NULL, 20);
INSERT INTO goods_amount VALUES(NULL, 23);SELECT * FROM goods_amount;
4.编写GoodsDao.java
package com.sxs.spring.tx;import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;import javax.annotation.Resource;/*** @author 孙显圣* @version 1.0*/
//反射创建bean对象
@Repository
public class GoodsDao {//依赖注入@Resourceprivate JdbcTemplate jdbcTemplate;/*** 根据商品id返回价格** @param id* @return*/public Double queryPriceById(Integer id) {String sql = "select price from goods where goods_id = ?";Double price = jdbcTemplate.queryForObject(sql, Double.class, id);System.out.println(id + "号商品价格为" + price);return price;}/*** 根据用户名id减少用户余额** @param user_id* @param money*/public void updateBalance(Integer user_id, Double money) {String sql = "update user_account set money = money - ? where user_id = ?";int update = jdbcTemplate.update(sql, money, user_id);if (update == 1) {System.out.println("用户余额减少成功");}}/*** 修改商品库存** @param goods_id* @param amount*/public void updateAmount(Integer goods_id, Integer amount) {String sql = "update goods_amount set goods_num = goods_num - ? where goods_id = ?";int update = jdbcTemplate.update(sql, amount, goods_id);if (update == 1) {System.out.println("商品库存减少成功!");}}}
1.编写配置文件JdbcTemplate_ioc.xml

image-20240223113504708

2.单元测试
package com.sxs.spring.tx;import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;import javax.annotation.Resource;/*** @author 孙显圣* @version 1.0*/
//反射创建bean对象
@Repository
public class GoodsDao {//依赖注入@Resourceprivate JdbcTemplate jdbcTemplate;/*** 根据商品id返回价格** @param id* @return*/public Double queryPriceById(Integer id) {String sql = "select price from goods where goods_id = ?";Double price = jdbcTemplate.queryForObject(sql, Double.class, id);System.out.println(id + "号商品价格为" + price);return price;}/*** 根据用户名id减少用户余额** @param user_id* @param money*/public void updateBalance(Integer user_id, Double money) {String sql = "update user_account set money = money - ? where user_id = ?";int update = jdbcTemplate.update(sql, money, user_id);if (update == 1) {System.out.println("用户余额减少成功");}}/*** 修改商品库存** @param goods_id* @param amount*/public void updateAmount(Integer goods_id, Integer amount) {String sql = "update goods_amount set goods_num = goods_num - ? where goods_id = ?";int update = jdbcTemplate.update(sql, amount, goods_id);if (update == 1) {System.out.println("商品库存减少成功!");}}}
5.编写GoodsService.java
package com.sxs.spring.tx.service;import com.sxs.spring.tx.GoodsDao;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;/*** @author 孙显圣* @version 1.0*/@Service
public class GoodsService {@Resourceprivate GoodsDao goodsDao;@Transactional //会将方法中对数据库的操作作为一个事务管理public void buyGoodsByTx(Integer userId, Integer goodsId, Integer amount) {//得到商品的价格Double price = goodsDao.queryPriceById(goodsId);//减少用户的余额goodsDao.updateBalance(userId, amount * price);//减少库存goodsDao.updateAmount(goodsId, amount);}
}
6.配置事务管理器JdbcTemplate_ioc.xml
    <!--配置事务管理器对象--><bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager"><!--需要与数据源关联,因为操作数据库的jdbcTemplate要与dataSource关联,他们要一致--><property name="dataSource" ref="dataSource"/></bean><!--配置启动注解的声明式事务管理功能--><tx:annotation-driven transaction-manager="transactionManager"/>

image-20240223124447662

7.进行测试
    //通过声明式事务管理测试@org.junit.jupiter.api.Testpublic void byGoodsByTx() {GoodsService bean1 = ioc.getBean(GoodsService.class);bean1.buyGoodsByTx(1, 1, 3);}

执行前后并没有出现数据不一致

image-20240223124633636

3.debug事务管理器DataSourceTransactionManager

1.基本步骤解释
1.配置文件
  • 首先配置了一个事务管理器对象,绑定与jdbcTemplate一致的数据源

  • 然后启动tx注解,绑定这个事务管理器对象

image-20240223130513649

2.注解
  • 当使用这个注解时,表名这个方法就会被AOP作为一个事务管理

image-20240223130805179

3.具体AOP示意图

image-20240223131706489

2.debug出现异常情况
1.下断点

image-20240223134007045

image-20240223134020750

2.执行

image-20240223134201189

3.下一个断点

image-20240223134248093

4.再打一个断点,跳过去

image-20240223134419259

5.下一个断点

image-20240223134520652

6.在con.rollback();打一个断点,跳过去然后下一步

image-20240223134647924

4.声明式事务传播机制

1.基本介绍

image-20240223134933511

image-20240223134943012

2.事务传播机制种类

image-20240223135400830

3.图解
1.默认事务传播机制(REQUIRED)
  • 可以理解为将方法1和方法2的事务功能去掉了,将方法1和方法2的代码合并交给Tx事务管理
  • 具体例子
    • 方法1出错:方法1和方法2和Tx事务全部回滚
    • 方法2出错:方法1和方法2和Tx事务全部回滚
    • Tx事务出错(除了方法1和方法2的部分):方法1和方法2和Tx事务全部回滚

image-20240223140441185

2.REQUIRES_NEW事务传播机制
  • 可以理解为Tx事务、方法1事务、方法2事务都是各自独立
  • 具体例子
    • 方法1出错:方法1事务回滚
    • 方法2出错:方法2事务回滚
    • Tx事务出错(除了方法1和方法2的部分):Tx事务(除了方法1和方法2的部分)回滚

image-20240223140854861

3.两种事务传播机制的区别

image-20240223141541267

4.声明式事务传播机制的设置方法

image-20240223141421702

5.应用实例
1.文件目录

image-20240223144431435

2.GoodsDao.java
package com.sxs.spring.tx;import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;import javax.annotation.Resource;/*** @author 孙显圣* @version 1.0*/
//反射创建bean对象
@Repository
public class GoodsDao {//依赖注入@Resourceprivate JdbcTemplate jdbcTemplate;//第一套方法/*** 根据商品id返回价格** @param id* @return*/public Double queryPriceById(Integer id) {String sql = "select price from goods where goods_id = ?";Double price = jdbcTemplate.queryForObject(sql, Double.class, id);System.out.println(id + "号商品价格为" + price);return price;}/*** 根据用户名id减少用户余额** @param user_id* @param money*/public void updateBalance(Integer user_id, Double money) {String sql = "update user_account set money = money - ? where user_id = ?";int update = jdbcTemplate.update(sql, money, user_id);if (update == 1) {System.out.println("用户余额减少成功");}}/*** 修改商品库存** @param goods_id* @param amount*/public void updateAmount(Integer goods_id, Integer amount) {String sql = "update goods_amount set goods_num = goods_num - ? where goods_id = ?";int update = jdbcTemplate.update(sql, amount, goods_id);if (update == 1) {System.out.println("商品库存减少成功!");}}//第二套方法/*** 根据商品id返回价格** @param id* @return*/public Double queryPriceById2(Integer id) {String sql = "select price from goods where goods_id = ?";Double price = jdbcTemplate.queryForObject(sql, Double.class, id);System.out.println(id + "号商品价格为" + price);return price;}/*** 根据用户名id减少用户余额** @param user_id* @param money*/public void updateBalance2(Integer user_id, Double money) {String sql = "update user_account set money = money - ? where user_id = ?";int update = jdbcTemplate.update(sql, money, user_id);if (update == 1) {System.out.println("用户余额减少成功");}}/*** 修改商品库存** @param goods_id* @param amount*/public void updateAmount2(Integer goods_id, Integer amount) {String sql = "update goods_amount set goods_num = goods_num - ? where goods_id = ?";int update = jdbcTemplate.update(sql, amount, goods_id);if (update == 1) {System.out.println("商品库存减少成功!");}}}
3.GoodsService.java
package com.sxs.spring.tx.service;import com.sxs.spring.tx.GoodsDao;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;/*** @author 孙显圣* @version 1.0*/@Service
public class GoodsService {@Resourceprivate GoodsDao goodsDao;//调用第一套方法@Transactional //会将方法中对数据库的操作作为一个事务管理public void buyGoodsByTx(Integer userId, Integer goodsId, Integer amount) {//得到商品的价格Double price = goodsDao.queryPriceById(goodsId);//减少用户的余额goodsDao.updateBalance(userId, amount * price);//减少库存goodsDao.updateAmount(goodsId, amount);}//调用第二套方法@Transactional //会将方法中对数据库的操作作为一个事务管理public void buyGoodsByTx2(Integer userId, Integer goodsId, Integer amount) {//得到商品的价格Double price = goodsDao.queryPriceById2(goodsId);//减少用户的余额goodsDao.updateBalance2(userId, amount * price);//减少库存goodsDao.updateAmount2(goodsId, amount);}
}
4.MultiplyService.java
package com.sxs.spring.tx.service;import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;/*** @author 孙显圣* @version 1.0*/
@Service
public class MultiplyService {@Resourceprivate GoodsService goodsService;@Transactional //默认事务传播机制public void multiBuyGoodsByTx() {//默认事务传播机制goodsService.buyGoodsByTx(1,1,1);goodsService.buyGoodsByTx2(1,1,1);}
}
5.默认传播机制测试
1.故意修改GoodsDao.java第一套的updateBalance方法

image-20240223144741663

2.初始数据表
  • 账户表

image-20240223144946645

  • 库存表

image-20240223144913270

3.测试代码
  • 此时是默认传播机制,所以如果第一套方法出现异常,则第二套方法也会回滚
  • 所以结果应该是数据表没有变化
    //事务传播机制测试@org.junit.jupiter.api.Testpublic void multiBuyGoodsByTx() {MultiplyService bean1 = ioc.getBean(MultiplyService.class);bean1.multiBuyGoodsByTx();}
4.结果展示

image-20240223145236270

image-20240223145243679

6.REQUIRES_NEW传播机制演示
1.故意修改GoodsDao.java第二套的updateBalance方法(第一套的改回来)

image-20240223151004668

2.修改GoodsService.java的两个事务传播机制

image-20240223145623684

3.修改MultiplyService.java的一个事务传播机制

image-20240223145648252

4.初始数据表
  • 账户表

image-20240223144946645

  • 库存表

image-20240223144913270

5.测试代码
  • 此时是REQUIRES_NEW传播机制,所以如果第二套方法出现异常,第一套方法不会回滚
  • 所以结果应该是第一套方法执行成功,张三购买一件商品1成功
    //事务传播机制测试@org.junit.jupiter.api.Testpublic void multiBuyGoodsByTx() {MultiplyService bean1 = ioc.getBean(MultiplyService.class);bean1.multiBuyGoodsByTx();}
6.结果展示

image-20240223150835997

image-20240223150825770

7.注意事项
  • 第一次我将第一套方法改错了,本来以为第二套方法会正常执行
  • 但是虽然事务是独立的,但是第一套方法报错了后面的就不继续执行了
  • 最外面的事务设置成默认的还是REQUIRES_NEW类型都不会影响里面的两个事务的独立性

5.事务隔离级别

1.基本介绍

image-20240223152325593

2.应用实例
1.简要介绍

image-20240223153156103

2.结果展示
1.原goods表

image-20240223153845855

2.启动测试程序

image-20240223153939973

3.修改id为1的价格

image-20240223154858766

4.打开断点,查看第二次结果

image-20240223154937502

3.修改事务隔离级别

image-20240223155307494

6.事务超时回滚

1.基本介绍

image-20240223155506448

image-20240223155716193

2.代码实例
1.GoodsService.java的buyGoodsByTxSOLATION方法
    @Transactional(timeout = 2) //设置超时回滚时间为2秒public void buyGoodsByTxSOLATION(){//查询两次商品的价格Double aDouble = goodsDao.queryPriceById(1);//减少用户的余额goodsDao.updateBalance2(1, 1000.0);try {//设置4秒休眠时间Thread.sleep(4000);} catch (InterruptedException e) {throw new RuntimeException(e);}Double aDouble1 = goodsDao.queryPriceById(1);System.out.println(aDouble1);}
2.测试程序
    @org.junit.jupiter.api.Testpublic void buyGoodsByTxSOLATION() {GoodsService bean1 = ioc.getBean(GoodsService.class);bean1.buyGoodsByTxSOLATION();}
3.原账户表
  • 如果没有回滚则money应该减少1000

image-20240223160316654

4.执行测试程序

image-20240223160528891

image-20240223160545038

7.课后练习

1.要求

image-20240223160756954

2.数据表设计
-- seller
CREATE TABLE seller (
seller_id INT UNSIGNED PRIMARY KEY auto_increment,
seller_name VARCHAR(32) NOT NULL DEFAULT'',
money DOUBLE NOT NULL DEFAULT 0.0
);INSERT INTO seller VALUES(NULL, '李白', 100.0)
SELECT * FROM seller-- buyer
CREATE TABLE buyer (
buyer_id INT UNSIGNED PRIMARY KEY auto_increment,
buyer_name VARCHAR(32) NOT NULL DEFAULT'',
money DOUBLE NOT NULL DEFAULT 0.0
);INSERT INTO buyer VALUES(NULL, '杜甫', 100.0)
SELECT * FROM buyer-- goods
CREATE TABLE goods (
goods_id INT UNSIGNED PRIMARY KEY auto_increment,
goods_name VARCHAR(32) NOT NULL DEFAULT'',
price DOUBLE NOT NULL DEFAULT 0.0,
goods_num INT UNSIGNED DEFAULT 0
);INSERT INTO goods VALUES(NULL, 100.0, 10, '酒')
SELECT * FROM goods-- taoBao
CREATE TABLE taoBao (
taoBao_id INT UNSIGNED PRIMARY KEY auto_increment,
goods_name VARCHAR(32) NOT NULL DEFAULT'',
money DOUBLE NOT NULL DEFAULT 0.0
)SELECT * FROM taoBao
3.代码实现
1.文件目录

image-20240223185143537

2.jdbc.properties
jdbc.user=root
jdbc.pwd=root
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring
3.txhomework.xml
<?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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--容器扫描--><context:component-scan base-package="com.sxs.spring.tx"/><!--数据库配置--><!--引入外部配置文件,读取数据源信息--><context:property-placeholder location="classpath:jdbc.properties"/><!--配置数据源--><bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource"><property name="user" value="${jdbc.user}"/><property name="password" value="${jdbc.pwd}"/><property name="jdbcUrl" value="${jdbc.url}"/><property name="driverClass" value="${jdbc.driver}"/></bean><!--配置JdbcTemplate对象--><bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate"><!--配置数据源属性--><property name="dataSource" ref="dataSource"/></bean><!--配置事务管理器对象--><bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager"><property name="dataSource" ref="dataSource"/></bean><!--启动事务管理器注解--><tx:annotation-driven transaction-manager="transactionManager"/></beans>
4.HomeWorkDao.java
package com.sxs.spring.tx.homework.dao;import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;import javax.annotation.Resource;/*** @author 孙显圣* @version 1.0*/
@Repository
public class HomeWorkDao {@Resourceprivate JdbcTemplate jdbcTemplate;//根据卖家id增加moneypublic int addMoneyBySellerId(Integer seller_id, Double money) {String sql = "update seller set money = money + ? where seller_id = ?";return jdbcTemplate.update(sql, money, seller_id);}//根据买家id减少moneypublic int subMoneyByBuyerId(Integer buyer_id, Double money) {String sql = "update buyer set money = money - ? where buyer_id = ?";return jdbcTemplate.update(sql, money, buyer_id);}//根据id减少商品库存量public int subGoodsNumByGoodsId(Integer goods_id, Integer goods_num) {String sql = "update goods se goods_num = goods_num - ? where goods_id = ?";return jdbcTemplate.update(sql, goods_num, goods_id);}//根据id查找商品价格public Double findPriceById(Integer goods_id) {String sql = "select price from goods where goods_id = ?";//public <T> T queryForObject(String sql, @Nullable Object[] args, Class<T> requiredType)//传入sql, Object[]填充sql的值,Class<T> requiredType传入要返回的类型Double aDouble = jdbcTemplate.queryForObject(sql, new Object[]{goods_id}, Double.class);return aDouble;}//给taoBao添加一条记录public int addtoTaoBao(Double money) {String sql = "insert into taoBao values(?, ?, ?)";return jdbcTemplate.update(sql, null, "name", money);}
}
5.HomeWorkService.java
package com.sxs.spring.tx.homework.service;import com.sxs.spring.tx.homework.dao.HomeWorkDao;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;/*** @author 孙显圣* @version 1.0*/
@Service
public class HomeWorkService {@Resourceprivate HomeWorkDao homeWorkDao;//买家买卖家的商品@Transactional //启动事务管理器public boolean getGoods(Integer seller_id, Integer buyer_id, Integer goods_id) {try {//1.根据id查找商品价格Double priceById = homeWorkDao.findPriceById(goods_id);//2.计算给淘宝的money和卖家得到的moneyDouble taobao_money = priceById * 0.1;Double seller_money = priceById * 0.9;//3.根据id修改卖家的moneyhomeWorkDao.addMoneyBySellerId(seller_id, seller_money);//4.根据id修改买家的moneyhomeWorkDao.subMoneyByBuyerId(buyer_id, priceById);//5.增加taobao表的记录homeWorkDao.addtoTaoBao(taobao_money);//6.减少库存homeWorkDao.subGoodsNumByGoodsId(goods_id, 1);} catch (Exception e) {System.out.println("购买商品逻辑出现问题!");throw new RuntimeException(e);}return true;}
}
6.测试类
package com.sxs.spring.tx.homework;import com.sxs.spring.tx.homework.service.HomeWorkService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @author 孙显圣* @version 1.0*/
public class Test {public static void main(String[] args) {ApplicationContext ioc = new ClassPathXmlApplicationContext("txhomework.xml");HomeWorkService bean = ioc.getBean(HomeWorkService.class);bean.getGoods(1, 1, 1);}
}
7.原数据表
  • seller

image-20240223185442943

  • buyer

image-20240223185448553

  • goods

image-20240223185454120

  • taoBao

image-20240223185500052

8.执行测试类
  • 如果执行成功
    • 李白money = 190
    • 杜甫money = 0
    • goods表goods_num = 7
    • taoBao表有一条新记录
  • 如果执行失败
    • 事务回滚
1.执行失败

image-20240223185843899

2.执行成功

image-20240223190012328

image-20240223190029665

image-20240223190035549

image-20240223190041325

image-20240223190047393

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/1858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】在ubuntu快速搭建部署K8S(1.27)集群

ubuntu快速安装K8s1.27 &#xff08;一&#xff09;环境说明1.硬件环境2.Ubuntu环境设置 &#xff08;二&#xff09;安装配置containerd1.安装2.配置3.启动 &#xff08;三&#xff09;所有节点操作1.安装runc和cni2.节点系统设置、关闭临时分区3.修改内核参数4.安装 kubeadm、…

稀碎从零算法笔记Day56-LeetCode:组合总和 Ⅳ

题型&#xff1a;DP、数组 链接&#xff1a;377. 组合总和 Ⅳ - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的…

代码随想录算法训练营第四十一天| 343.整数拆分、96.不同的二叉搜索树

系列文章目录 目录 系列文章目录343. 整数拆分动态规划 96.不同的二叉搜索树动态规划 343. 整数拆分 动态规划 动规五部曲&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i]表示分拆数字i&#xff0c;可以得到的最大乘积为dp[i]。确…

盲人出行挑战与曙光:“盲人视觉辅助技术研发”助力无障碍生活

作为一名资深记者&#xff0c;我深感盲人朋友们在日常出行中面临的种种困难。然而&#xff0c;在科技日新月异的今天&#xff0c;一项名为蝙蝠避障的专为盲人视觉辅助技术研发的领域正在以前沿科技成果&#xff0c;为改善盲人出行困境带来希望之光。本文将深入探讨这一技术如何…

FastGPT+ChatGLM3本地部署

FastGPTChatGLM本地部署 本地部署硬性要求&#xff1a;显存13g以上 关于环境的安装就不多赘述&#xff0c;conda pip 可以解决大部分问题 ChatGLM本地运行 m3e-basechatglm3-6b 在huggingface上可以下载上述模型&#xff0c;如果没有梯子可以使用huggingface镜像 从git…

【进程地址空间】地址空间理解存在原因 | 深入理解页表写时拷贝虚拟地址

目录 地址空间深入理解 划分区域 理解地址空间 地址空间存在的意义 意义1 意义2 意义3 理解页表和写时拷贝 页表 写时拷贝 OS识别错误 理解虚拟地址 fork解释 上篇我们简单的学习了进程地址空间/页表/物理地址/虚拟地址/写时拷贝等概念。本篇深入理解下。 地址空…

Ubuntu系统下 Nvidia驱动 + cuda驱动 + CuDNN安装与卸载

Ubuntu系统下 Nvidia驱动 cuda驱动 CuDNN安装与卸载 一、NVIDIA驱动与CUDA驱动的区别二、NVIDIA驱动安装与卸载1. 查看系统内核版本2. 查看显卡型号3. 查看是否有显卡驱动4. 禁用nouveau并重启5. 卸载旧版本6. 安装&#xff11;&#xff1a;使用标准Ubuntu仓库进行自动化安装…

学习笔记Day21:转录组差异分析

转录组差异分析 差异分析难点在于将数据处理成需要的格式 表达矩阵 数值型矩阵-count 行名是symbol 低表达量的基因需要过滤 分组信息 因子&#xff0c;对照组在level第一位 与表达矩阵的列一一对应 项目名称 字符串&#xff08;不要有特殊字符&#xff09; TCGA-XX…

路由策略实验

一.实验拓扑图&#xff1a; 二.实验要求&#xff1a; 1.按照图示配置IP地址&#xff0c;R1,R3,R4上使用loopback口模拟业务网段 2.R1和R2运行RIPv2&#xff0c;R2&#xff0c;R3和R4运行OSPF&#xff0c;各自协议内部互通 3.在RIP和OSPF间配置双向路由引入&#xff0c;要求除R4…

PHP 函数的命名空间是否会影响执行顺序?

在 php 中&#xff0c;函数命名空间一般不会影响执行顺序。执行顺序通常由文件顺序或函数调用顺序决定。即使函数位于不同的命名空间中&#xff0c;只要它们在同一文件中&#xff0c;它们就会按照定义顺序执行。 PHP 函数命名空间是否会影响执行顺序&#xff1f; 简介 在 PHP…

pygame 烟花效果

# 初始化 pygame.init() screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption(烟花效果) # 焰火发射 particles [] # 焰火粒子 def firework(x, y): num_particles 100 # 每次发射的…

关于ResNet的假说

ResNet 最核心的思想就是 恒等映射吧 那么现在来提出几个问题&#xff1a; 为什么deeper 以后train L 会增加&#xff1f;恒等映射会解决什么问题&#xff1f;能否解决梯度非常陡峭的问题&#xff1f;你想到了什么模型有类似的问题&#xff0c;如何进行改进的&#xff1f; as…

本地环境通过ssh通道连接服务器数据库,实现本地客户端和代码可以访问数据库

使用方法&#xff1a; ssh -p 搭建隧道的端口 -fNL 本地端口:远程ip:远程端口号 搭建隧道的账号搭建隧道的ip 可以增加参数-v,输出更多的信息 ssh -p 搭建隧道的端口 -fNL 本地端口:远程ip:远程端口号 -v 搭建隧道的账号搭建隧道的ip 有时候&#xff0c;测试环境的数据库不允许…

ClickHouse 数据类型、表引擎与TTL

文章目录 数据类型表引擎1.TinyLog 引擎2.MergeTree 引擎3.ReplacingMergeTree 引擎4.AggregatingMergeTree 引擎5.SummingMergeTree 引擎6.CollapsingMergeTree 引擎7.Distributed 引擎 TTL列级 TTL表级TTL 数据类型 ClickHouse 数据类型Java 数据类型数据范围UInt8Short0 到…

获取肖博数学全套视频+讲义

肖博数学是一个专业团队&#xff0c;教学方法非常颠覆&#xff0c;具有很多技巧&特殊的解题方法内容&#xff0c;能使得学生在高考时冲刺高分 hello&#xff0c;今天分享一下高中数学资料&#xff0c;肖博数学&#xff0c; 他们的教学方法与传统的教学方式有所不同&#…

vue实现周日历 日历按周切换 vue日程管理

实现的功能 1、点击今天&#xff1a;回到今日日期并选中今日日期&#xff0c;查当天数据 2、点击左箭头&#xff1a;切换上一周 3、点击右箭头&#xff1a;切换下一周 4、黄圆圈代表有日程提醒&#xff0c;点击选中&#xff0c;下方对应显示当前日程提醒的内容&#xff0c;没有…

C++设计模式|创建型 4.建造者模式

1.什么是建造者模式? 建造者模式&#xff08;也被成为生成器模式&#xff09;&#xff0c;是一种创建型设计模式&#xff0c;软件开发过程中有的时候需要创建很复杂的对象&#xff0c;而建造者模式的主要思想是将对象的构建过程分为多个步骤&#xff0c;并为每个步骤定义一个…

nlp 自然语言处理的dataset数据库积累

下面的这个和 entity recognition有关的。 Weights & Biases

3i平台体验性能加持,13600KF+B760M+撼与科技A770 TITAN装机体验

在2022年&#xff0c;intel重启显卡线&#xff0c;带来了多款性价比十分不错的显卡。而近段时间&#xff0c;又有传言说intel第二代产品e即将面世&#xff0c;甚至已经有数款Battlemage GPU曝光&#xff0c;让不少intel忠实粉丝直呼期待&#xff0c;或许在今年年底&#xff0c;…

mysql面试题八(SQL语句)

目录 1.SQL 基本组成部分 常用操作示例 创建表 插入数据 查询数据 更新数据 删除数据 创建索引 授予用户权限 2.常见的聚合查询 1. 计数&#xff08;COUNT&#xff09; 2. 求和&#xff08;SUM&#xff09; 3. 平均值&#xff08;AVG&#xff09; 4. 最大值&…