Spring的事务控制-基于AOP的声明式事务控制
Spring的事务控制-基于AOP的声明式事务控制
Spring事务编程概述
事务是开发中必不可少的东西,使用JDBC开发时,我们使用connection对事务进行控制,使用MyBatis时,我们使用SqlSession对事务进行控制,缺点就是,当我们切换数据库访问技术时,事务控制的方式总会变化,Spring就在这些技术基础上,提供了统一的控制事务的接口。Spring的事务分为:编程式事务控制和声明式事务控制
事务控制方式 | 解释 |
---|---|
编程式事务控制 | Spring提供了事务控制的类和方法,使用编码的方式对业务代码进行事务控制,事务控制代码和业务操作代码耦合到了一起,开发中不使用 |
声明式事务控制 | Spring将事务控制的代码封装,对外提供了xml和注解配置方式,通过配置的方式完成事务的控制,可以达到事务控制与业务操作代码解耦合,开发中推荐使用 |
Spring事务编程相关的类主要有如下三个
事务控制相关类 | 解释 |
---|---|
平台事务管理器 PlatformTransactionManager | 是一个接口标准,实现类都具备事务提交、回滚和获得事务对象的功能,不同持久层框架可能会有不同实现方案 |
事务定义 TransactionDefinition | 封装事务的隔离级别、传播行为、过期时间等属性信息 |
事务状态 TransactionStatus | 存储当前事务的状态信息,如事务是否提交、是否回滚、是否有回滚点等 |
搭建测试环境
搭建一个转账的环境,dao层一个转出钱的方法,一个转入钱的方法,service层一个转账业务方法,内部分别调用dao层转出钱和转入钱的方法,准备工作如下:
- 数据库准备一个账户表 tb_account;
- dao层准备一个AccountMapper,包括incrMoney和decrMoney两个方法;
- service层准备一个transferMoney,分别调用incrMoney和decrMoney方法;
- 在applicationContext文件中进行Bean的管理配置;
- 测试正常转账与异常转账;
select * from tb_account;
id | account_name | money |
---|---|---|
1 | tom | 5000 |
2 | lucy | 5000 |
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
package com.luxifa.mapperpublic interface AccountMapper {//+钱@update(update tb_account set money=money+#{money} where account_name=#{accountName})public void incrMoney(@Param("accountName") String accountName,@Param("money") Integer money);//-钱@Update("update tb_account set money=money-#{money} where account_name=#{accountName}")public void decrMoney(@Param("accountName") String accountName,@Param("money") Integer money);
}
package com.luxifa.service;public interface AccountService {void transferMoney(String outAccount,String inAccount,Interger money);}
@Service("accountService")
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountMapper accountMapper;@Overridepublic void transferMoney(String outAccount,String inAccount,Integer money) {accountMapper.decrMoney(outAccount,money);accountMapper.incrMoney(inAccount,money);}}
xml中
<!--组件扫描-->
<context:component-scan base-package="com.luxifa"/><!--加载properties文件-->
<context:property-placeholder location="classpath:jdbc:properties"/><!--配置数据源信息-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><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><!--配置SqlSessionFactoryBean,作用将SqlSessionFactory存储到spring容器-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property>
</bean><!--MapperScannerConfigurer,作用扫描指定的包,产生Mapper对象存储到Spring容器-->
<bean class="org.mybatis.spring.mapper.MapperScannerCongigurer"><property name="basePackage" value="com.luxifa.mapper"></property>
</bean>
测试类:
public class AccountTest {public static void main(String[] args) {ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");AccountService accountService = app.getBean(AccountService.class);accountService.transferMoney("tom","lucy",500);}
}
结果:
select * from tb_account;
id | account_name | money |
---|---|---|
1 | tom | 4500 |
2 | lucy | 5500 |
基于xml声明式事务控制
结合AOP技术,可以使用AOP对Service的方法进行事务增强
- 目标类:自定义的AccountServiceImpl,内部的方法是切点
- 通知类:Spring提供的,通知方法已经定义好,只需要配置即可
分析:
- 通知类是Spring提供的,需要导入Spring事务的相关坐标;
- 配置目标类AccountServiceImpl;
- 使用advisor标签配置切面。
@Service("accountService")
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountMapper accountMapper;@Overridepublic void transferMoney(String outAccount,String inAccount,Integer money) {accountMapper.decrMoney(outAccount,money);accountMapper.incrMoney(inAccount,money);}public void registerAccout () {}}
xml中
<!--组件扫描-->
<context:component-scan base-package="com.luxifa"/><!--加载properties文件-->
<context:property-placeholder location="classpath:jdbc:properties"/><!--配置数据源信息-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><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><!--配置SqlSessionFactoryBean,作用将SqlSessionFactory存储到spring容器-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property>
</bean><!--MapperScannerConfigurer,作用扫描指定的包,产生Mapper对象存储到Spring容器-->
<bean class="org.mybatis.spring.mapper.MapperScannerCongigurer"><property name="basePackage" value="com.luxifa.mapper"></property>
</bean><!--配置平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransationManager"><property name="dataSource" ref="dataSource"/>
</bean><!--配置Spring提供好的Advice-->
<tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attribute><!--配置不同的方法的事务属性name:方法名称 *代表通配符 添加操作addUser、addAccount、addOrders->add*isolation:事务的隔离级别,解决事务并发问题timeout:超时时间 默认-1(没有超时时间) 单位是秒read-only:是否只读,查询操作设置为只读,默认是falsepropagation:事务的传播行为,解决业务方法调用业务方法(事务嵌套问题)--><tx:method name="transferMoney" isolation="READ_COMMITTED" timeout="3" read-only="false"/><tx:method name="registerAccount"/><tx:method name="add*"/><tx:method name="update*"/><tx:method name="selete"/><tx:method name="*"/></tx:attribute>
</tx:advice><!--事务增强的aop-->
<aop:config><!--配置切点表达式--><aop:pointcut id="txPointcut" expression="execution(* com.luxifa.service.impl.*.*(..))"/><!--配置织入关系 通知advice-ref引入Spring提供好的--><aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
isolation属性:指定事务的隔离级别,事务并发存在三大问题:脏读、不可重复读、幻读/虚读。可以通过设置事务的隔离级别来保证并发问题的出现,常用的是READ_COMMITTED和REPEATABLE_READ
isolation属性 | 解释 |
---|---|
DEFAULT | 模式隔离级别,取决于当前数据库隔离级别,例如MySQL默认隔离级别是REPEATABLE_READ |
READ_UNCOMMITTED | A事务可以读取到B事务尚未提交的事务记录,不能解决任何并发问题,安全性最低,性能最高 |
READ_COMMITTED | A事务只能读到其他事务已经提交的记录,不能读取到未提交的记录。可以解决脏读问题,但是不能解决不可以重复读和幻读 |
REPEATBLE_READ | A事务多次从数据库读取某条记录结果一致,可以解决不可重复读,不可以解决幻读 |
SERLALIZABLE | 串行化,可以解决任何并发问题,安全性最高,但是性能最低 |
read-only属性:设置当前的只读操作,如果是查询则设置为true,可以提高查询性能,如果是更新(增删改)操作则设置为false
<!--一般查询相关的业务操作都会设置为只读模式-->
<tx:method name="select*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
timeout属性:设置事务执行的超时时间,单位是秒,如果超过该时间限制但事务还没有完成,则自动回滚事务,不在继续执行。默认值是-1,即没有超过时间限制
<!--设置查询操作的超时时间是3秒-->
<tx:method name="select*" read-only="true" timeout="3"/>
propagation设置:设置事务的传播行为,主要解决是A方法调用B方法时,事务的传播方式问题,例如:使用单方面的事务,还是A和B都可以使用自己的事务等。事务的传播行为有如下七种属性值可配置
事务传播行为 | 解释 |
---|---|
REQUIRED(默认值) | A调用B,B需要事务,如果A有事务就加入A的事务中,如果A没有事务,B就自己创建一个事务 |
REQUIRED_NEW | A调用B,B需要新事务,如果A有事务就挂起,B自己创建一个新的事务 |
SUPPORTS | A调用B,B有无事务无所谓,A有事务就加入到A事务中,A无事务就以非事务方式执行 |
NOT_SUPPORTS | A调用B,B以无事务方式执行,A如有事务则挂起 |
NEVER | A调用B,B以无事务方式执行,A如有事务则抛出异常 |
MEADATORY | A调用B,B要加入A的事务中,如果A无事务就抛出异常 |
NESTED | A调用B,B创建一个新事务,A有事务就作为嵌套事务存在,A没事务就以创建的新事务执行 |
基于注解声明式事务控制
@Service("accountService")
@Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountMapper accountMapper;@Override@Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)public void transferMoney(String outAccount,String inAccount,Integer money) {accountMapper.decrMoney(outAccount,money);accountMapper.incrMoney(inAccount,money);}public void registerAccout () {}}
xml中
<!--组件扫描-->
<context:component-scan base-package="com.luxifa"/><!--加载properties文件-->
<context:property-placeholder location="classpath:jdbc:properties"/><!--配置数据源信息-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><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><!--配置SqlSessionFactoryBean,作用将SqlSessionFactory存储到spring容器-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property>
</bean><!--MapperScannerConfigurer,作用扫描指定的包,产生Mapper对象存储到Spring容器-->
<bean class="org.mybatis.spring.mapper.MapperScannerCongigurer"><property name="basePackage" value="com.luxifa.mapper"></property>
</bean><!--配置平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransationManager"><property name="dataSource" ref="dataSource"/>
</bean>xml中```xml
<!--组件扫描-->
<context:component-scan base-package="com.luxifa"/><!--加载properties文件-->
<context:property-placeholder location="classpath:jdbc:properties"/><!--配置数据源信息-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><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><!--配置SqlSessionFactoryBean,作用将SqlSessionFactory存储到spring容器-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property>
</bean><!--MapperScannerConfigurer,作用扫描指定的包,产生Mapper对象存储到Spring容器-->
<bean class="org.mybatis.spring.mapper.MapperScannerCongigurer"><property name="basePackage" value="com.luxifa.mapper"></property>
</bean><!--配置平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransationManager"><property name="dataSource" ref="dataSource"/>
</bean><!--事务的自动代理(注解驱动)-->
<tx:annotation-driven transaction-manager="transactionManager"/>
使用全注解方式:
@Configuration
@ComponentScan("com.luxifa")
@PropertySource("classpath:jdbc.properties")
@MapperScan("com.luxifa.mapper")
@EnableTransactionManagement //<tx:annotation-driven/>
public class SpringConfig {public DataSource dataSource(@Value("${jdbc.driver}" String driver,@Value("{jdbc.url}" String url,@Value("${jdbc.username}"),@Value("${jdbc.password}") {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}@Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);return sqlSessionFactoryBean;}@Beanpublic DataSourceTransactionManager transactionManager (DataSource daaSource) {DataSourceTRansactionManager dataSourceTransactionManager = new DataSourceTransactionManager();dataSourceTransactionManager.setDataSource(dataSource);return dataSourceTransactionManager;}}
测试类:
public class AccountTest {public static void main(String[] args) {ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfig.class);AccountService accountService = app.getBean(AccountService.class);accountService.transferMoney("tom","lucy",500);}
}
相关文章:
Spring的事务控制-基于AOP的声明式事务控制
Spring的事务控制-基于AOP的声明式事务控制 Spring事务编程概述 事务是开发中必不可少的东西,使用JDBC开发时,我们使用connection对事务进行控制,使用MyBatis时,我们使用SqlSession对事务进行控制,缺点就是ÿ…...
SSO(单点登陆)
Single Sign On 一处登陆、处处可用 0、前置概念: 1)、单点登录业务介绍 早期单一服务器,用户认证。 缺点:单点性能压力,无法扩展 分布式, SSO(single sign on)模式 解决 : 用户身份信息独…...
线程和QObjects
QObject的可重入性: QThread继承了QObject,它发出信号以指示线程开始或完成执行,并提供一些插槽。 QObjects可以在多个线程中使用发出调用其他线程中槽的信号,并将事件发布到在其他线程中“活动”的对象。这是可能的࿰…...
最新中文版FL Studio21水果软件下载安装图文教程
FL Studio是目前流行广泛使用人数最多音乐编曲制作软件,这款软件相信广大网友并不陌生,今天带来的是FL中文版本,所有的功能都能在线编辑,用户直接就能操作,同时因为是21水果是最新版,所以增加了新的功能&am…...
pandas数据分析35——多个数据框实现笛卡尔积
什么是笛卡尔积。就是遍历所有组合的可能性。 比如第一个盒子有[1,2,3]三个号码球,第二个盒子有[4,5]两个号码球。那么从每个盒子里面分别拿一个球共有3*2两种可能性,其集合就是{[1,4],[2,4],[3,4],[1,5],[2,5],[3,5]},这个就是笛卡尔积。 三个盒子也是…...
【C语言学习笔记】:数组倒序排列,数组倒置
数组倒置就是将数组元素中的数据倒过来! 举个例子,比如下面程序: #include <stdio.h>int main(void) { int a[5] {1, 2, 3, 4, 5}; int b[5]; //用来存放倒置后的数据 int i, j; for (i0, j4; i<5, j>0; i, --j)…...
sni+tomcat漏洞复现
sni SNI产生背景 SSL以及TLS(SSL的升级版)为客户端与服务器端进行安全连接提供了条件。但是,由于当时技术限制,SSL初期的设计顺应经典的公钥基础设施 PKI(Public Key Infrastructure)设计,PKI 认为一个服务器只为一个…...
Linux ALSA 之十:ALSA ASOC Machine Driver
ALSA ASOC Machine Driver一、Machine 简介二、ASoC Machine Driver2.1 Machine Driver 的 Platform Driver & Platform Device 驱动模型2.2 在 Probe() 中注册声卡三、snd_soc_register_card 函数3.1 bind DAIs3.2 New a sound card3.3 Create card new widgets3.4 Probe …...
Spring 面试题(一):Spring 如何处理全局异常?
❤️ 博客首页:水滴技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 🌸 订阅专栏:Spring 教程:从入门到精通 文章目录1、如何处理全局异常2、代码示例2.1、定义统一的“响应结果对象”2.2、…...
Threadlocal为何引发内存泄漏问题
首先我们要先了解什么是泄漏问题和什么是内存溢出 内存泄漏表示程序员申请了内存,但是该内存一直无法被释放 内存溢出表示申请内存不足,就会报错 为何引发内存泄漏问题 因为每个线程都有自己独立的ThreadLocalMap对象,key为ThreadLocal&…...
如何写好 Python 的 Lambda 函数?
当你需要完成一件小工作时,在本地环境中使用这个函数,可以让工作如此得心应手,它就是 Lambda 函数。 Lambda 函数是 Python 中的匿名函数。有些人将它们简称为lambdas,它们的语法如下: lambda arguments: expression…...
大数据技术架构(组件)32——Spark:Spark SQL--Execute Engine
2.2、Spark SQL2.2.1、Execute EngineSparkSql的整体提交执行流程和Hive的执行流程基本上一致。站在通用的角度,对于SparkSql来说,从Sql到Spark的RDD执行需要经历两个大的阶段:逻辑计划和物理计划逻辑计划层面会把用户提交的sql转换成树型结构…...
Leetcode.1138 字母板上的路径
题目链接 Leetcode.1138 字母板上的路径 Rating : 1411 题目描述 我们从一块字母板上的位置 (0, 0)出发,该坐标对应的字符为 board[0][0]。 在本题里,字母板为board ["abcde", "fghij", "klmno", "pqr…...
一个自动配置 opengrok 多项目的脚本
前段时间在服务器上配置 opengrok 阅读代码,项目有很多个,一个一个手动配置比较繁琐。 我从搭建 tomcat 和 opengrok,到配置和索引完 5 个 Android 项目,用了差不多一整天。 要是再让我手动配置几个项目,估计真要崩溃…...
JAVA同步代码块 同步方法
JAVA同步代码块 & 同步方法 为了解决多线程操作共享数据时产生的安全问题 例如以下代码 if (ticket < 0) {// 卖完了break; } else {ticket--;System.out.println(Thread.currentThread().getName() "在卖票,还剩下" ticket "张")…...
分享111个助理类简历模板,总有一款适合您
分享111个助理类简历模板,总有一款适合您 111个助理类简历模板下载链接:https://pan.baidu.com/s/1JafYuLPQMmq37K4V0wiqWA?pwd8y54 提取码:8y54 Python采集代码下载链接:https://wwgn.lanzoul.com/iKGwb0kye3wj 设计师助理…...
Allegro如何更改临时高亮的颜色设置操作指导
Allegro如何更改临时高亮的颜色设置操作指导 在用Allegro做PCB设计的时候,当移动或者高亮某个对象之前,会被临时高亮一个颜色,方便查看,类似下图 运行高亮命令的时候,器件被临时高亮成了白色 软件默认的是白色,如何更改成其它颜色? 具体操作如下 点击Display选择Color…...
知识图谱嵌入技术研究综述
作者 张天成 1 , * 田 雪 1 , * 孙相会 1 , * 于明鹤 2 , * 孙艳红 1 , * 于 戈 摘要 知识图谱 是一种用图模型来描述知识和建模事物之间的关联关系的技术。 知识图谱嵌入 作为一种被广泛采用的知识表示方法。 主要思想是将知识图谱中的实体和关系嵌入到连续的向量空间中…...
Scratch少儿编程案例-水果忍者-超完整
专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...
练 习
1.判断三个中最重的//依次输入相应的人的体重double people1, people2, people3;cout << "请输入第一个人体重" << endl;cin >> people1;cout << "请输入第二个人体重" << endl;cin >> people2;cout << "请…...
Urho3D整体结构
Urho3D引擎编译成一个库。从概念上讲,它由几个代表不同子系统或功能的“子库”组成。其中每个都位于Source/Urho3D目录下的子目录中: 容器:提供STL替换类和共享指针。数学:提供相交测试中使用的矢量、四元数和矩阵类型以及几何形状。Core:提供执行上下文…...
大数据技术之Hudi
Hudi概述 1.1 Hudi简介 Apache Hudi(Hadoop Upserts Delete and Incremental)是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和并发&a…...
libxlsxwriter条件格式
今天来看一个libxlsxwriter的高级用法:一个条件格式的示例。 说它“高级”,也是基于非Excel专家的小白们的视角。对,没错,本小白正是这样的小白。 1 一个简单的问题 来看我们今天的场景问题:有一列数据,有…...
nodejs+vue+elementui在线求助系统vscode
目 录 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 前端技术:nodejsvueelementui,视图层其实质就是vue页面,通过编写vue页面从而展示在浏览器中,编写完成的vue页面要能够和控制器类进…...
电子技术——BJT差分输入对
电子技术——BJT差分输入对 本节我们来讨论BJT差分输入对。 共模输入 下图是BJT差分输入对的基本原理图: 首先我们考虑两端输入共模信号 VCMV_{CM}VCM : 此时 vB1vB2VCMv_{B1} v_{B2} V_{CM}vB1vB2VCM 因为电路的对称结构,所以 i…...
[MySQL教程②] - MySQL介绍和发展史
目录 ❤ MySQL介绍 ❤ 什么是数据库 ❤ 什么是数据 ❤ 数据库管理系统 ❤ NoSQL特性总览 ❤ NoSQL的分类、特点、典型产品 ❤ 常见的数据库产品有哪些? ❤ Oracle公司产品介绍 Oracle数据库版本介绍 Oracle的市场应用 MySQL数据库版本介绍 MyS…...
多表查询--实例
1 创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); 创建score表。SQL代码如下: CREATE TABLE score ( id INT…...
Differentially Private Grids for Geospatial Data
文章目录abstractintroabstract 在本文中,我们解决了为二维数据集(如地理空间数据集)构建差异私有概要的问题。目前最先进的方法通过执行数据域的递归二进制分区和构造分区的层次结构来工作。我们表明,基于分区的概要方法的关键挑战在于选择正确的分区粒…...
Java学习记录day8
类与对象 继承例题 https://www.bilibili.com/video/BV1PU4y1E7nX?p55&vd_source8f80327daa664c039f5c342a25bcbbae(B站千峰马剑威Java基础入门视频第P55,记录的重要学习内容之一) final关键字 作用: 声明一个常量&…...
Solon2 开发之容器,三、注入或手动获取 Bean
1、如何注入Bean? 先了解一下Bean生命周期的简化版: 运行构建函数尝试字段注入(有时同步注入,没时订阅注入。不会有相互依赖而卡住的问题)Init 函数(是在容器初始化完成后才执行)…释放&#…...
企业建网站公司多少钱/百度指数app
五、学习LLC谐振变换电路的工作原理 在具有电阻R、电感L和电容C元件的交流电路中,电路两端的电压与其中电流相位一般是不同的。如果调节电路元件(L或C)的参数或电源频率,可以使它们相位相同,整个电路呈现为纯电阻性。…...
企业文化包括哪六个/网站优化 秦皇岛
王可伟 作品 地形篇(第十)(读《孙子兵法》,悟管理、营销之道)本篇论述军事地形学上的问题。孙子通过“地有六形”、“兵有六败”的论述,揭示了敌情与军事地理的相互关系,提出了“料敌制胜&#…...
wordpress模板+bridge/企业网络营销目标
1. 工作机制 一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。DataNode 启动后向 NameNode 注册,通过后ÿ…...
十堰高端网站建设/竞价排名
在Web开发中,后端跟前端配合非常easy出现故障。这时我们就须要一些规则来约束前端任意的编写。CSS编程规范 1. 属性书写基本顺序 a. 先位置属性(position, top, right, z-index, display, float等) b. 大小(width,…...
个人网站做博客还是做论坛/网络推广专员
原型:extern void *memcpy(void *dest, void *src, unsigned int count); 用法:#include 功能:由src所指内存区域复制count个字节到dest所指内存区域。 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针…...
做细胞激活的母液网站/广安百度推广代理商
使用sass的方法: 在终端输入: 1,第一步是安装Sass gem: gem install sass 如果您使用Windows,则可能需要先安装Ruby(http://www.ruby-lang.org/zh_cn/downloads/)。 2, cd 进入需要启…...