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

武汉营销型网站建设找关键词的方法与技巧

武汉营销型网站建设,找关键词的方法与技巧,吴忠北京网站建设,日本进口yamawaSpring的事务控制-基于AOP的声明式事务控制 Spring事务编程概述 事务是开发中必不可少的东西,使用JDBC开发时,我们使用connection对事务进行控制,使用MyBatis时,我们使用SqlSession对事务进行控制,缺点就是&#xff…

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;

idaccount_namemoney
1tom5000
2lucy5000

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;

idaccount_namemoney
1tom4500
2lucy5500

基于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_UNCOMMITTEDA事务可以读取到B事务尚未提交的事务记录,不能解决任何并发问题,安全性最低,性能最高
READ_COMMITTEDA事务只能读到其他事务已经提交的记录,不能读取到未提交的记录。可以解决脏读问题,但是不能解决不可以重复读和幻读
REPEATBLE_READA事务多次从数据库读取某条记录结果一致,可以解决不可重复读,不可以解决幻读
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_NEWA调用B,B需要新事务,如果A有事务就挂起,B自己创建一个新的事务
SUPPORTSA调用B,B有无事务无所谓,A有事务就加入到A事务中,A无事务就以非事务方式执行
NOT_SUPPORTSA调用B,B以无事务方式执行,A如有事务则挂起
NEVERA调用B,B以无事务方式执行,A如有事务则抛出异常
MEADATORYA调用B,B要加入A的事务中,如果A无事务就抛出异常
NESTEDA调用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);}
}
http://www.mnyf.cn/news/48428.html

相关文章:

  • 简述网站推广方式seo推广方案怎么做
  • 兰州网站建设怎么选最近一周的重大热点新闻
  • 2015年做那个网站能致富图们网络推广
  • 中国十大知名网站建设电商网站开发
  • 房地产定制开发天津优化公司
  • 手机网页制作网站建设福州百度快速优化
  • 免费网站加速器国内十大4a广告公司
  • 重庆制作网站公司简介分析影响网站排名的因素
  • 教育类网站怎么做优化seo搜索引擎优化实训总结
  • 上海企业网站建设报价软文代写兼职
  • 易点设计郑州seo方案
  • 两个网站做的h5如何合在一起怎么seo网站关键词优化
  • 如果做网站需要多少钱衡阳网站建设公司
  • 十大免费建站程序wordpress免费代理浏览网页
  • 自建网站注册域名很有必要最新新闻事件今天疫情
  • 山东临朐门户网站官网百度建站平台官网
  • 所有网站名称大全今日国际新闻热点
  • 子网站数量品牌传播策略
  • 班级网站建设毕业论文简述搜索引擎的工作原理
  • 山东网站建设公司网站网络优化外包
  • 做网站费用搜索引擎营销优化诊断训练
  • 梅林 建站 wordpress免费制作自己的网页
  • 可以做全景的网站抖音关键词挖掘工具
  • 做网站设计的公司柳州制作网站需要什么软件
  • 图展网站源码推广公司好做吗
  • 长宁移动网站建设福州百度快照优化
  • 58网站怎么做才有客户问百度推广多少钱
  • 沈阳营销型网站制作软文网站推广
  • 秦皇岛网站seo石家庄疫情防控最新政策
  • 个人网站建设流程什么叫口碑营销