spring配置事务传播
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于spring配置事务传播内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在spring配置事务传播相关知识领域提供全面立体的资料补充。同时还包含 safari浏览器、samba、SAMP 的知识内容,欢迎查阅!
spring配置事务传播相关知识
-
Spring事务的传播行为本文主要介绍下Spring事务中的传播行为。事务传播行为介绍Spring中的7个事务传播行为:|事务行为|说明 ||:--|:--||PROPAGATION_REQUIRED | 支持当前事务,假设当前没有事务。就新建一个事务 || PROPAGATION_SUPPORTS |支持当前事务,假设当前没有事务,就以非事务方式运行 || PROPAGATION_MANDATORY| 支持当前事务,假设当前没有事务,就抛出异常|| PROPAGATION_REQUIRES_NEW | 新建事务,假设当前存在事务。把当前事务挂起||PROPAGATION_NOT_SUPPORTED | 以非事务方式运行操作。假设当前存在事务,就把当前事务挂起 || PROPAGATION_NEVER | 以非事务方式运行,假设当前存在事务,则抛出异常 || PROPAGATION_NESTED |如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 |举例说明案例代
-
Java高频面试题分享(六)——Spring 支持的数据库事务传播属性和事务隔离级别面试题: 请介绍下 Spring 支持的常用数据库事务传播属性和事务隔离级别? 参考答案: 事务传播属性: 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。(一个方法运行在了一个开启事务的方法中时,当前方法是使用原来的事务还是开启一个新的事务)例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。事务的传播行为可以由传播属性指定,Spring 定义了 7 种传播行为。 传播属性 描述 REQUIRED 默认值,如果有事务正在运行,当前的方
-
spring的事务管理配置spring有两种事务配置器,可以使用spring的jdbc事务管理器,也可以使用对hibernate的事务管理器第一种 使用Spring JDBC或IBatis进行事务配置(配置文件方式):<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.
-
Spring 事务配置解惑事务是数据库区别于文件系统的一个重要特征,数据库通过事务保证了数据库中数据的完整性,也就是一个事务内的 N 多操作要么全部都提交,要么全部都回滚。在 Spring 框架中使用事务,我们需要在 XML 里面配置好多 Bean,而这些 Bean 背后都做了哪些事情那,并不是每个人都清楚。通过<a rel="dofollow" href="https://www.fgba.net/" title="富贵"><font color=#202020 >富贵</font></a> Chat 您将能弄清楚Mybatis结合Spring中 XML 文件里面配置事务时,每个配置项 Bean
spring配置事务传播相关课程
spring配置事务传播相关教程
- 9.1 事务管理器 transactionManager 在 xml 文件中对应 <transactionManager type="JDBC"/>,其中 type 属性对应了事务管理器的两种类型,分别是JDBC和MANAGED。JDBC :直接使用了 JDBC 的提交和回滚机制。MANAGED:让容器来管理事务的整个生命周期,例如 spring 容器。提示: 如果你使用 spring 作为容器,那么 transactionManager 会被自动配置且可用。
- 2.1 配置文件上传组件 打开项目中的 WebConfig 文件,添加如下代码:@Beanpublic MultipartResolver multipartResolver() { return new StandardServletMultipartResolver();}MultipartResolver 是一个接口,约定了文件上传的方法。StandardServletMultipartResolver 是具体的实现类,用来完成文件上传。对上传的文件信息进一步进行配置,如限制文件大小、文件类型等。打开 WebInitializer 文件,重写 customizeRegistration() 方法:@Overrideprotected void customizeRegistration(Dynamic registration) { registration.setMultipartConfig(new MultipartConfigElement(null,2000000,400000,0));}MultipartConfigElement()方法可以接收 3 个参数:第一个参数指定保存上传文件的临时目录。如果指定 null,由 Spring MVC 自己提供;最好不要指定;第二个参数,文件上传的最小大小限制;第三个参数,文件上传的最大尺寸限制。
- 2. 邮箱 pop3/smtp 服务配置 SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。目前许多邮箱为了保障用户邮箱的安全,都默认都关闭了 POP3/SMTP/IMAP 的开关,在用户需要这些功能时请 “开启”。 本小节中以 QQ 邮箱为例进行 pop3/smtp 服务配置,登录成功后,进入【设置】->【账户】,在【POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服务】处,开启【POP3/SMTP 服务】,如下图所示:保存好授权码后,点击确定按钮,即开启 POP3/SMTP 服务,如下图所示:
- 2. Zookeeper 实现配置中心 配置中心来更新配置的方式有两种,一种是由配置中心的配置更新后向服务推送更新的配置,另一种是服务定时轮询的方式的去配置中心拉取配置,发现配置中心的配置被更新就更新自己的配置。Zookeeper 实现配置中心的方式:服务把自己的配置信息存储到 Zookeeper 节点的 data 上,并且对这个节点开启 Watch 监听,只要这个节点的数据发生变化,Zookeeper 就会把这个消息推送给服务,服务在回调事件中去获取该节点的数据,然后使用新的数据更新自己的配置。那么根据这个思路,我们就开始使用 Zookeeper 来实现配置中心。这里我们使用 Zookeeper 来维护数据源的信息,使用 Spring Boot 框架来搭建测试项目。
- 2.1 工程搭建 1. 创建工程2. 引入依赖<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> <!-- Spring jdbc 使用的依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.7</version> </dependency> </dependencies>3. 准备代码实体类代码/** * 账户的实体类 */public class Account implements Serializable { //数据id private Integer id; //账号编码 private String accountNum; //账号金额 private Float money;}持久层接口代码/** * 账户的持久层接口 */public interface IAccountDao { /** * 根据Id查询账户 * @param accountId * @return */ Account findAccountById(Integer accountId); /** * 保存账户 * @param account */ void saveAccount(Account account); /** * 更新账户 * @param account */ void updateAccount(Account account);}持久层实现类代码/** * 账户的持久层实现类 */@Repositorypublic class AccountDaoImpl implements IAccountDao { //jdbc模板类属性 @Autowired private JdbcTemplate jdbcTemplate; //根据id查找 public Account findAccountById(Integer accountId) { List<Account> accounts = jdbcTemplate.query("select * from account where id = ?",new BeanPropertyRowMapper<Account>(Account.class),accountId); return accounts.isEmpty()?null:accounts.get(0); } public void saveAccount(Account account) { jdbcTemplate.update("insert into account values(?,?,?)", account.getId(),account.getAccountNum(),account.getMoney()); } public void updateAccount(Account account) { jdbcTemplate.update("update account set accountnum=?,money=? where id=?",account.getAccountNum(),account.getMoney(),account.getId()); }}业务层接口代码/** * @Auther: wyan */public interface UserService { /** * 账户转账 * @param fromId toId */ public void transMoney(Integer fromId, Integer toId, Integer money);}业务层实现类代码/** * @Auther: wyan * @Description: */@Service@Transactionalpublic class UserServiceImpl implements UserService { @Autowired private IAccountDao accountDao; public void transMoney(Integer fromId, Integer toId, Integer money) { Account fromAccount = accountDao.findAccountById(fromId); Account toAccount = accountDao.findAccountById(toId); //原始账号减钱 fromAccount.setMoney(fromAccount.getMoney()-money); accountDao.updateAccount(fromAccount); //抛出异常 int i=1/0; //转账账号加钱 toAccount.setMoney(toAccount.getMoney()+money); accountDao.updateAccount(toAccount); }}Tips: 此时需要注意注解 @Transactional 的含义。Transactional 就是表示事务,那么在此类上面加入注解,说明需要 Spring 框架针对此类的方法做事务的增强行为,也就是说此注解其实是相当于我们在配置文件中配置的节点 tx:advice。那么这时候有的细心的同学可能会有些疑问:我们在 xml 文件中可以配置事务的传播行为与隔离级别,那么这一个注解如何制定事务的传播行为与隔离级别呢?一个类中如果定义方法过多,而实际上需要增强控制事务的方法只有一部分,如何缩小粒度,只控制需要事务的方法呢?ok,大家。这里有必要跟大家解释下此注解的其余使用方式:问题一答疑:在注解后面可以通过括号内的参数设置隔离级别与传播行为。比如:@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.READ_COMMITTED) 此表达式的含义是事务一定需要,并且是读已提交。问题二答疑:在方法上使用注解。类上面可以不使用 @Transactional 注解,而是将注解写在需要用到事务的方法之上。4. 配置文件<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--配置JdbcTemplate--> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置数据源--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql:///transmoney"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean> <!--包路径扫描--> <context:component-scan base-package="com.offcn"></context:component-scan> <!--事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置数据源--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql:///transmoney"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean> <!--包路径扫描--> <context:component-scan base-package="com.offcn"></context:component-scan> <!--事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!--注解事务驱动--> <tx:annotation-driven/></beans>Tips: 此处需要注意 tx:annotation-driven 节点无需配置通知节点与切面节点,而是使用 tx:annotation-driven 节点表示,事务的支持方式为声明式事务。5. 测试代码public class AccountServiceTest { public static void main(String[] args) { //1.获取容器 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); //2.获取业务对象 UserService userService = ac.getBean(UserService.class); //3.从id为1的账号转成1000到2账号 userService.transMoney(1,2,1000); System.out.println("转账完成.."); }}6. 测试结果:ok, 大家,我们继续测试之前的转账代码,依然得到错误的异常信息。同时数据库的金额并没有发生改变,因为事务的控制,保证了数据的一致性原子性。那么也证明我们声明式事务的案例测试成功。
- 2. 静态服务资源配置 配置静态资源服务器是非常简单的一件事情。实现静态资源访问的关键指令有 root 和 alias,我们会做一个案例来演示其用法和二者的区别。
spring配置事务传播相关搜索
-
s line
safari浏览器
samba
SAMP
samplerate
sandbox
sanitize
saper
sas
sass
save
smarty模板
smil
smtp
snapshot
snd
snmptrap
soap
soapclient
soap协议