Spring中事务控制的API介绍(PlatformTransactionManager和TransactionDefinition)

`org.springframework.jdbc.datasource.DataSourceTransactionManager` 是 Spring JDBC 模块中的一个类 (序列化): 这是最严格的隔离级别,确保每个事务在其执行过程中看到的是数据库的一致视图。(可重复读): 在这个级别上,事务看到的数据是一致的,不会因为并发事务的插入、删除或更新而改变。如果事务A在一个事务B开始后读取了一行数据,并保持该行数据不变,直到事务A结束,那么事务B不能在其内部更改那行数据。: 最低的隔离级别,可能会导致脏读、幻读和不可重复读,因为在事务开始时就读取的数据可能随后被其他未提交的事务修改。注解来标记需要事务控制的方法,可以选择不同的隔离级别、传播行为和回滚策略。 阅读详情

什么是事务?

当你需要一次执行多条SQL语句时,可以使用事务。通俗一点说,如果这几条SQL语句全部执行成功,则才对数据库进行一次更新,如果有一条SQL语句执行失败,则这几条SQL语句全部不进行执行,这个时候需要用到事务。

数据库事务的四大特性ACID:

原子性(Atomicity)
       要么都执行,要么都不执行

一致性(Consistency)
       事务前后的数据都是正确的

隔离性(Isolation)
      事物之间相互隔离,互不干扰(并发执行的事务彼此无法看到对方的中间状态)

持久性(Durability)
       事务一旦提交不可再回滚 

  1. JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计业务层的事务处理解决方案。
  2. Spring框架为我们提供了一组事务控制的接口。 PlatformTransactionManager和TransactionDefinition

事务控制的API

PlatformTransactionManager接口

        作用:是一个事务管理器,负责开启、提交或回滚事务
        实现类:DataSourceTransactionManager(sqlSession)

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

public interface PlatformTransactionManager { 
    
  	//开启事务  
    TransactionStatus getTransaction(TransactionDefinition definition) 
        						throws TransactionException; 
    //提交事务
    void commit(TransactionStatus status) throws TransactionException; 
    
  	//回滚事务
    void rollback(TransactionStatus status) throws TransactionException;   
} 

Spring为不同的orm框架提供了不同的PlatformTransactionManager接口实现类:

  • DataSourceTransactionManager:使用Spring JDBC或iBatis 进行持久化数据时使用

  • HibernateTransactionManager:使用Hibernate版本进行持久化数据时使用

TransactionDefinition接口

         作用:定义事务的属性
        实现类:DefaultTransactionDefinition

TransactionDefinition接口包含与事务属性相关的方法 ,源代码如下

public interface TransactionDefinition {
    int PROPAGATION_REQUIRED = 0;
    int PROPAGATION_SUPPORTS = 1;
    int PROPAGATION_MANDATORY = 2;
    int PROPAGATION_REQUIRES_NEW = 3;
    int PROPAGATION_NOT_SUPPORTED = 4;
    int PROPAGATION_NEVER = 5;
    int PROPAGATION_NESTED = 6;
    int ISOLATION_DEFAULT = -1;
    int ISOLATION_READ_UNCOMMITTED = 1;
    int ISOLATION_READ_COMMITTED = 2;
    int ISOLATION_REPEATABLE_READ = 4;
    int ISOLATION_SERIALIZABLE = 8;
    int TIMEOUT_DEFAULT = -1;
    
    //传播行为
    int getPropagationBehavior();
	//隔离级别
    int getIsolationLevel();
    //事务超时
    int getTimeout();
    //是否只读
    boolean isReadOnly();
}

 TransactionDefinition 接口定义的事务规则包括:事务隔离级别、事务传播行为、事务超时、事务的只读、回滚规则属性,同时,Spring 还为我们提供了一个默认的实现类:DefaultTransactionDefinition,该类适用于大多数情况。如果该类不能满足需求,可以通过实现 TransactionDefinition 接口来实现自己的事务定义。

事务并发时的安全问题 

问题描述隔离级别
脏读一个事务读取到另一个事务还未提交的数据read-commited
不可重复读一个事务内多次读取一行数据的内容,其结果不一致repeatable-read
幻读一个事务内多次读取一张表中的内容,其结果不一致serialized-read

事务的隔离级别

隔离级别说明
ISOLATION_DEFAULT这是一个platfromtransactionmanager默认的隔离级别,使用数据库默认的事务隔离级别。
ISOLATION_READ_UNCOMMITTED这是事务最低的隔离级别,会产生脏读,不可重复读和幻像读。
ISOLATION_READ_COMMITTED这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。 Oracle数据库默认的隔离级别。
ISOLATION_REPEATABLE_READ这种事务隔离级别可以防止脏读、不可重复读,但是可能出现幻像读。MySQL数据库默认的隔离级别。
ISOLATION_SERIALIZABLE这是花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。除了防止脏读、不可重复读外,还避免了幻像读。
事务的隔离级别解决的事务并发时的安全问题 
隔离级别是否脏读是否不可重复度是否幻读
ISOLATION_DEFAULTxx√
ISOLATION_READ_UNCOMMITTED√√√
ISOLATION_READ_COMMITTEDx√√
ISOLATION_REPEATABLE_READxx√
ISOLATION_SERIALIZABLExxx

事务的传播行为

  • 什么是事务传播行为?

    事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。 例如:methodA事务方法调用methodB事务方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这就是由methodB的事务传播行为决定的。

Spring定义了七种传播行为:

事务传播行为类型说明
PROPAGATION_REQUIRED如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与REQUIRED类似的操作。

在Spring框架中,事务的传播属性指的是当一个方法被调用时,它如何与现有的事务进行交互或创建新事务的一组行为规则。以下是一些Spring中定义的主要事务传播属性及其含义:

  1. PROPAGATION_REQUIRED(必须支持):

    • 这是最常用的设定,如果没有正在进行的事务,则开始一个新的事务;如果已经存在一个事务,那么该方法就在这个事务范围内执行。
  2. PROPAGATION_SUPPORTS(支持当前事务):

    • 若当前存在事务,则方法在这个事务内执行;如果当前没有事务,方法也能在非事务状态下执行。
  3. PROPAGATION_MANDATORY(强制事务):

    • 必须在已有事务环境下执行,如果当前没有事务存在,则抛出异常。
  4. PROPAGATION_REQUIRES_NEW(必须新建事务):

    • 无论当前是否存在事务,都会开启一个新的事务来执行,并且将当前事务挂起,新事务结束后再恢复旧事务。
  5. PROPAGATION_NOT_SUPPORTED(不支持事务):

    • 方法执行时不希望有事务参与,如果存在事务则暂停该事务直到方法执行完毕。
  6. PROPAGATION_NEVER(禁止事务):

    • 方法绝对不能在事务中执行,如果发现有事务存在,则抛出异常。
  7. PROPAGATION_NESTED(嵌套事务):

    • 如果当前存在事务,则在嵌套事务内执行,即子事务。如果当前没有事务,则其行为如同PROPAGATION_REQUIRED,会新建一个事务。

通过合理配置事务的传播属性,开发人员可以根据业务逻辑的具体情况精确控制事务的范围和行为,确保数据操作的一致性和完整性。

事务超时

timeout事务超时时间: 当前事务所需操作的数据被其他事务占用,则等待。

  • 100:自定义等待时间100(秒)。

  • -1:由数据库指定等待时间,默认值。(建议)

读写性

readonly 读写性

  • true:只读,可提高查询效率,适合查询

  • false:可读可写,适合增删改

回滚规则

rollbackOn 回滚规则,可省略或设置 rollbackOn="Exception"

  • 如果事务中抛出 RuntimeException,则自动回滚

  • 如果事务中抛出 CheckException,不会自动回滚

TransactionStatus

PlatformTransactionManager.getTransaction(…) 方法返回一个 TransactionStatus 对象,该对象代表一个新的或已经存在的事务,源代码如下:

public  interface TransactionStatus{
   boolean isNewTransaction();
   void setRollbackOnly();
   boolean isRollbackOnly();
}

转账案例

新建项目

配置pom.xml
    <dependencies>
        <!-- Spring常用依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.1.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.1.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.8.RELEASE</version>
        </dependency>
        <!-- MySql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.0</version>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.3</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.3</version>
        </dependency>
        <!--日志-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.26</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.1.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
    <build>
        <resources>
            <!-- 如果不添加此节点src/main/java目录下的所有配置文件都会被漏掉。 -->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
<!--            让MyBatis识别resiurces文件夹下的文件-->
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
    </build>
配置db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3305/spring?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=
配置applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       ">
<!--    Springioc注解扫描支持-->
    <context:component-scan base-package="com.by.service"></context:component-scan>
<!--    配置数据库-->
<!--    加载数据源-->
    <context:property-placeholder location="classpath:db.properties"/>
<!--    配置数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
<!--    会话工厂-->
    <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!--让mybatis扫描mapper接口,生成代理类并交给spring的ioc容器去管理-->
    <bean  class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--mapper所在的包-->
        <property name="basePackage" value="com.by.mapper"></property>
        <property name="sqlSessionFactoryBeanName" value="sessionFactory"></property>
    </bean>

<!--DataSourceTransactionManager:是一个数据源事务管理器,负责开启,提交和回滚事务-->
    <bean id="sourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

<!--    DefaultTransactionDefinition:定义事务属性-->
     <bean id="transactionDefinition" class="org.springframework.transaction.support.DefaultTransactionDefinition">
        <!--
            隔离级别:默认值DEFAULT,等价于REPEATABLE_READ
            传播行为:默认值REQUIRED,methodB()会加入到methodA()事务中
            事务超时:默认值-1,永不超时
            是否只读:默认值false,适用于增删改
            回滚规则:可省略
            
        -->
<!--        以下配置均为默认属性,不用注入-->
<!--&lt;!&ndash;        注入隔离级别&ndash;&gt;-->
<!--        <property name="isolationLevel" value="REPEATABLE"></property>-->
<!--&lt;!&ndash;        注入传播行为&ndash;&gt;-->
<!--        <property name="propagationBehavior" value="REQUIRED"></property>-->
<!--&lt;!&ndash;        注入事务超时&ndash;&gt;-->
<!--        <property name="timeout" value=""></property>-->
<!--&lt;!&ndash;        注入是否只读&ndash;&gt;-->
<!--        <property name="readOnly" value="false"></property>-->
    </bean>
</beans>

三层架构建包

service包下UserService类
public interface UserService {

    void updateUser(String source, String target, Float money);
}
service包下UserServiceImpl实现类
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private PlatformTransactionManager transactionManager;

    @Autowired
     private TransactionDefinition transactionDefinition;


    @Override
    public void addUser(User user) {
        userMapper.addUser(user);
    }
    @Override
    public void updateUser(String source,String target,Float money){
        TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition);
        try {
            //扣钱
            userMapper.updateUserOfSub(source,money);
            int a=6/0;
            //加钱
            userMapper.updateUserOfAdd(target,money);
            //业务执行后,提交事务
            transactionManager.commit(transactionStatus);
        } catch (Exception e) {
            e.printStackTrace();
            //业务出错时,回滚事务
            transactionManager.rollback(transactionStatus);
        }
    }
}
mapper包下UserMapper类
public interface UserMapper {
    void updateUserOfSub(@Param("source") String source, @Param("money")Float money);
    void updateUserOfAdd(@Param("target")String target, @Param("money")Float money);
}
mapper包下UserMapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.by.mapper.UserMapper">
    <!--转账-->
    <update id="updateUserOfSub">
        update t_user set money=money-#{money} where name=#{source}
    </update>

    <update id="updateUserOfAdd">
        update t_user set money=money+#{money} where name=#{target}
    </update>
</mapper>
 pojo包下User类
public class User {
    private Integer id;
    private String name;
    private Float money;

    public User(String name, Float money) {
        this.name = name;
        this.money = money;
    }

    public User() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Float getMoney() {
        return money;
    }

    public void setMoney(Float money) {
        this.money = money;
    }
}
 测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class ServiceTest {
    @Autowired
    private UserService userService;
    @Test
    public void testAdd(){
        userService.addUser(new User("张wu丰",4000F));

        userService.addUser(new User("宋远桥",2000F));
    }
    @Test
    public void testUpdate(){
        userService.updateUser("张三丰","宋远桥",1F);
    }
}

测试结果

spring 事务管理配置 一般的,我们把事务配在service层,利用service的业务逻辑接口统一的管理。 为什么不用在dao层呢? 因为一个service有可能调用多个dao,而这多个dao有可能相互联系,有时候一个操作需要调用多次数据库,但是这多次调用要么全提交,要么全回滚。  因此,在dao层调用事务理论上说不是一个很明智的选择。应该有业务逻辑层service层负责事务,统一处理。  Spring 阅读详情

相关推荐

Springboot+Mybatis-解决JPA、JDBC冲突导致@Transactional事务不生效不回滚的问题

项目中jpa、mybatis混用时,需要在使用@Bean(“xxx”)注解注册对象时,对dataSource、sqlSessionFactory、DataSourceTransactionManager显示配置;注解@EnableTransactionManagement标记启用事务,没加事务不会起作用,手动调用session对象的rollback()也无效;通过打印事务管理器,发现Mybatis环境下的事务管理器实例为JpaTransactionManager对象,明显不对。

草青工作室 的专栏 3931

Spring事务核心接口:PlatformTransactionManager

PlatformTransactionManager是Spring框架中事务管理的核心接口,它负责管理事务的创建、提交和回滚等操作。在Spring中,事务管理是通过PlatformTransactionManager和TransactionManager接口来实现的。PlatformTransactionManager是一个更高级的接口,它封装了TransactionManager接口,提供了更丰富的事务管理功能。

five-five 5002

Spring的事务控制----编程式事务控制相关对象介绍

使用接口对应的实现,Spring已经为他提供对应的实现了,不同的持久层对应的接口是不一样的,而这个平台管理器内部封装的就是事务管理器。这个事务平台管理器只规定你控制事务的一些行为,但是事务怎么控制,根据不同的持久层框架进行处理,比如原生jdbc模板我用,A方案,Mybatis,我用B方案,直白一点就是A到B,A业务方法到B业务方,B看A有没有事务,B看A有事务,那B就看A的事务,B看A没事务,那B就自己找一个事务。

weixin_54048131的博客 308

分布式事务系列(1.1)Spring事务管理器PlatformTransactionManager

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34032779的博客 1009

Python语言在工业控制中的简单应用

在工业控制中,经常需要对采集到的数据进行分析和处理,Python的这些库可以简化这一过程。传统的工业控制系统多依赖于专用的控制硬件和软件,但随着技术的发展,开放性和灵活性成为了新的需求焦点。还有,Python社区活跃,提供了大量的开源代码和模块,这对于工业控制领域来说是一个巨大的资产。Python作为一种高级编程语言,因其简洁的语法、强大的库支持和广泛的社区资源而在工业界获得了快速的发展和广泛的应用。在工业控制领域,Python的应用日益增多,这得益于其跨平台性、脚本语言的灵活性以及与硬件设备交互的能力。

2303_78014702的博客 1720

BUCK 电路详解

参考内容: 手撕Buck!Buck公式推导过程 电力电子的基础应用 《精通开关电源设计(第二版)》 Buck电源芯片输出有问题?检查这几样 原来PWM这么简单! BUCK 电路构建 根据高中所学习的物理知识可以很容易的想到,使用一个滑动变阻器即可实现降压和稳压的效果。当负载波动时,通过改变滑动变阻器的阻值,可以调节负载所获得的电压。但是使用滑动变阻器的劣势也很明显,大量的耗能会导致器件温度快速升高。 上面所提到的电路主要缺点在于导通器件(变阻器或三极管)本身存在耗能,那么有没有不会耗能的导通器件呢?

Guanngxu的博客 3985

Spring事务控制

Spring事务介绍、事务控制、Spring中事务控制的API介绍、Spring动态代理控制事务、Spring AOP控制事务、基于注解的AOP控制事务

qq_62965575的博客 2575

链路聚合Eth-trunk以及华为交换机配置实例

链路聚合简介 以太网链路聚合Eth-Trunk简称链路聚合,它通过将多条以太网物理链路捆绑在一起成为一条逻辑链路,从而实现增加链路带宽的目的。同时,这些捆绑在一起的链路通过相互间的动态备份,可以有效地提高链路的可靠性。 目的: 随着网络规模不断扩大,用户对骨干链路的带宽和可靠性提出越来越高的要求。在传统技术中,常用更换高速率的接口板或更换支持高速率接口板的设备的方式来增加带宽,但这种方案需要付出高额的费用,而且不够灵活。 采用链路聚合技术可以在不进行硬件升级的条件下,通过将多个物理接口捆绑为一个逻辑接口

ChaseAug的博客 2万+

Spring框架|事务控制API介绍

文章目录一、明确Spring中的事务控制二、Spring 中事务控制的 API 介绍1.PlatformTransactionManager2.TransactionDefinition3.事务的隔离级别4.事务的传播行为5.超时时间6.是否是只读事务7.TransactionStatus 一、明确Spring中的事务控制 JavaEE 体系进行分层开发,事务处理位于业务层,Spring 提供...

匿名攻城狮 3543

家庭网络中,路由器和交换机的连接顺序

它的目的是给路由器增加端口,用户访问互联网的速度比情况一要快,常用于办公网络、家庭成员多的场景。光纤入户首先连接的肯定是光猫,而在光猫的后面,是先连接交换机?还是应该接路由器呢?家庭网络中路由器和交换机的先后连接顺序。它目的是让更多的用户访问互联网。常用于一些超大型机房、网吧等。至于路由器和交换机的区别。两者之间很多功能都有兼容。但用户上网速度相对较慢。在技术日益迭代的今天。

m0_74075744的博客 1万+

SpringBoot+Vue+kkFileView实现文档管理(文档上传、下载、在线预览)

上面在使用OpenOffice实现doc、excel、ppt等文档的管理和预览。除此之外可用kkFileView实现包括且更多文档的预览。

BADAO_LIUMANG_QIZHI的博客 1万+

Spring事务控制总结

Spring框架为我们提供了一组事务控制的API,本文在此总结下如何通过XML方式和注解方式,进行配置事务控制。 Spring 中事务控制的 API 介绍 PlatformTransactionManager 此接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法,如下图: 我们在开发中都是使用它的实现类,如下图: TransactionDefinition 它是事务的定...

rotation博客 970

从 Non-Unicode 到 Unicode:ABAP 程序切换的坑、原理与工程化落地指南

摘要 老SAP系统中ABAP程序员常假设1字符=1字节,导致大量代码依赖单字节处理逻辑。Unicode系统的引入彻底改变了字符长度、偏移量等底层认知,强制要求程序遵循Unicode规则。关键问题包括:字符/字节语义混淆、结构体访问风险、以及ABAP语言版本的门槛限制。迁移时需要重点关注字符串处理、二进制协议解析等场景,利用UCCHECK、RSUNISCAN_FINAL等工具扫描风险,并通过持续集成机制确保代码质量。建议在Non-Unicode阶段就启用unicode_check参数模拟严格模式,分批次修复问

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3454

Spring 中的事务控制

Spring 中事务控制的 API 介绍 PlatformTransactionManager 此接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法,如下图: 真正管理事务的对象 org.springframework.jdbc.datasource.DataSourceTransactionManager 使用 Spring---------JDBC 或 iBatis 进...

xzzz2020的博客 444

【keil5和STC-ISP】保姆级下载安装教程

点击下载中的产品下载。然后就会看到如下界面:可以看到,提供了针对不同芯片架构的四套独立开发工具。:你使用的51单片机,其核心就是。C51套件里的编译器是专门为这个架构优化的。:如果安装了MDK-Arm,你在创建新项目时将像“AT89C51”这样的51系列芯片型号,无法进行开发。进入如下界面:双击下载 → 双击运行安装 → 同意协议并下一步 → 使用默认安装路径 → 完成安装。

深耕CV 1641

专栏目录:Linux 内存管理子系统的进化——从 MM 到 HMM

专栏梳理了Linux内存管理子系统从经典MM到异构内存管理(HMM)的演进历程。内容分为六大部分:首先介绍经典MM基础,包括虚拟地址空间、页表、VMA等核心机制;其次分析MM通用框架如页表遍历、NUMA迁移等;然后探讨设备内存引入的关键技术,如ZONE_DEVICE和dev_pagemap;接着深入解析HMM核心机制及其与DMA的集成;随后通过多个实际驱动案例展示HMM应用;最后讨论大页支持等进阶主题。专栏采用"经典机制→问题→扩展方案"的三段式结构,帮助开发者理解Linux如何通过HMM实现设备内存管理。

图形/计算GPU的驱动与虚拟化技术分享园地 868

Spring_事务控制

Spring 将Spring复习进行了收尾,在Spring框架中,还有一部分很重要的内容,就是对声明式事务的支持。 在Spring中对事务控制都是基于AOP的,它既可以通过编程方式进行实现,也可以通过配置方式实现,复习的重点是通过配置的方式实现对事务控制。 Spring中事务控制的API 1,PlatformTransactionManager :此接口是spring的事务管理器,提供常用事务操作...

Running_lemon的博客 236

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

spring中事务控制的一组API

Spring事务控制我们要明确的 第一:JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计业务层的事务处理解决方案。 第二:spring框架为我们提供了一组事务控制的接口。具体在后面的第二小节介绍。这组接口是在spring-tx-5.0.2.RELEASE.jar中。 第三:spring的事务控制都是基于AOP的,它既可以使用编程的方式实现,也可以使用配置的方式实现...

Leon_Jinhai_Sun的博客 498

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Spring学习笔记】—— (五)Spring中的事务控制

> - JavaEE 体系进行分层开发,事务处理位于业务层,Spring 提供了分层设计业务层的事务处理解决方 案。 > - spring 框架为我们提供了一组事务控制的接口。这组接口是在 `spring-tx-5.0.2.RELEASE.jar` 中。 > - spring 的事务控制都是基于 AOP 的,它既可以使用编程的方式实现,也可以使用配置的方式实现。学习的重点是使用配置的方式实现

小牛肉的博客 711

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Spring事务控制-API+AOP事务控制

Spring事务控制 JavaEE 体系进行分层开发,事务处理位于业务层,Spring 提供了分层设计业务层的事务处理解决方 案。 spring 框架为我们提供了一组事务控制的接口。这组接口是在 spring-tx-5.0.2.RELEASE.jar 中。 spring 的事务控制都是基于 AOP 的,它既可以使用编程的方式实现,也可以使用配置的方式实现。 1.事务控制的API 1.1PlatformTransactionManager spring 的事务管理器,提供常用的操作事务的方法 获取事务状态

weixin_44325370的博客 199

Spring框架(十三):spring的声明式事务控制

一、spring事务控制的API 1、PlatformTransactionManager 1.1、作用:提供了常用的操作事务的方法。 1.2、常用方法: TransactionStatus getTransaction(TransactionDefinition definition):获取事务状态信息 void commit(TransactionStatus status):提交事...

yu1755128147的博客 199

Spring学习笔记【part10】TX事务控制

Spring 学习笔记 Part10 1. Spring 中的事务控制 TX是transaction的缩写。Spring给我们提供了事务控制的API,我们需要导入它的jar包坐标。 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.0.2.RELEASE</v

Parker_cpp的博客 656

Spring---学习第四天(jdbcTemplate+Spring的事务控制)

JdbcTemplate JdbcTemplate是 spring 框架中提供的一个对象,它的作用和QueryRunning一样,是对原始 Jdbc API 对象的简单封装。 spring 框架提供了很多正对不同数据库类型的模板类。 操作关系型数据: JdbcTemplate HibernateTemplate 操作 nosql 数据库 RedisTemplate 操作消息队列 JmsTemplate 使用JdbcTemplate的两种方式 方法一  在dao中定义JdbcTemplate X

空圆小生的博客 285

Spring中的JDBC及事务控制

它是 spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装。spring 框架为我们提供了很多 的操作模板类。 操作关系型数据的:JdbcTemplate、HibernateTemplate 操作 nosql 数据库的:RedisTemplate 操作消息队列的:JmsTemplate 我们今天的主角在 spring-jdbc-5.0.2.RELEASE.jar 中,我们在导包的时候,除了要导入这个 jar 包 外,还需要导入一个 spring-tx-5.0.2.RELEASE.j

weixin_45701378的博客 408

Java框架_Spring5_day09_事务控制

十一、Spring 中的事务控制 11.1 Spring 事务控制的API 11.1.1 PlatformTransactionManager 此接口是spring的事务管理器,它里面提供了我们常用的操作事务的方法,如下图: 我们在开发中都是使用它的实现类: org.springframework.jdbc.datasource.DataSourceTransactio...

cpz 306

Spring中的事务控制,阿里P8大佬亲自教你

如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了《Java中高级核心知识全面解析》是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了《Java中高级核心知识全面解析》[外链图片转存中…(img-9QQ6HUhy-1711996373152)][外链图片转存中…(img-FqdYtoqJ-1711996373152)]

code8889的博客 388
上一篇: Spring整合MyBatis
下一篇: MySQL的事务隔离级别(脏读,不可重复读,幻读的解释和解决)
涵冰...
博客等级 码龄4年 2438粉丝 243原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涵冰...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值