目录

1.分类

事务控制的方式:

  • 编程式事务控制:编程灵活,但是开发繁琐,每次都要开启、回滚等操作

    • jdbc:Conn.setAutoCommite(false); //设置手动事务控制
    • hibernate:Session.beginTransaction(); //开启事务
  • 声明式事务控制:使用配置文件实现,使用时添加配置,不需要时候移除配置即可。核心是aop,所以控制粒度在方法。也就是对方法来应用事务,不能对方法中的某几行代码实现。对于事务的控制应该放到Server层来处理。

    • jdbc:DataSourceTransactionManager

    • hibernate:


2.Spring对jadc事务管理

2.1xml方式

2.1.1首先定义Dao对象和Server对象

package per.liyue.spring.jdbc_trancation_xml;

import org.springframework.jdbc.core.JdbcTemplate;

/**
* Created by liyue on 2016/11/30.
*/
public class RoleDao
{
private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate)
{
this.jdbcTemplate = jdbcTemplate;
} public void save(String sql)
{
jdbcTemplate.update(sql);
}
}
package per.liyue.spring.jdbc_trancation_xml;

/**
* Created by liyue on 2016/11/30.
*/
public class RoleService
{
private RoleDao roleDao; public void setRoleDao(RoleDao roleDao)
{
this.roleDao = roleDao;
} public void save(String sql)
{
roleDao.save(sql);
int i = 10 / 0;//这里执行失败要回滚成功的操作
roleDao.save(sql);
}
}

2.1.2配置文件实现事务管理

配置中要注意:

  • 配置文件中对于事务的命名空间(xmlns:tx="http://www.springframework.org/schema/tx")要引入
  • 对于jdbc来说核心是通过org.springframework.jdbc.datasource.DataSourceTransactionManager来实现事务控制
  • 对于DataSourceTransactionManager的实现还需要配置tx:advice来指明对于哪些方法有哪些权限的操作
  • 对于拦截方法可以用*来模糊匹配
<?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"
xmlns:aop="http://www.springframework.org/schema/aop"
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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!--1.jdbc的基本配置-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///hi"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="roleDao" class="per.liyue.spring.jdbc_trancation_xml.RoleDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<bean id="roleService" class="per.liyue.spring.jdbc_trancation_xml.RoleService">
<property name="roleDao" ref="roleDao"></property>
</bean> <!--2.事务配置--> <!--2.1事务管理器-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean> <!--2.2事务控制 transaction-manager:jdbc的事务管理器 method:配置需要管理的方法和属性,这里可以用*来模糊匹配 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="save*" read-only="false"/>
</tx:attributes>
</tx:advice> <!--2.3事务AOP aop:advisor:指定事务控制和切入点 -->
<aop:config>
<aop:pointcut id="pt"
expression="execution(* per.liyue.spring.jdbc_trancation_xml.RoleService.*(..))"></aop:pointcut>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt"></aop:advisor>
</aop:config>
</beans>

2.2注解方式

注解方式实现相对简单很多!

需要改动的点:

  • 开启注解
  • 指定注解的事务管理类
  • 对各个类增加注解(@Repository,@Service,@Resource)
  • 对于需要事务管理的位置增加注解@Transactional:
    • 对方法增加:对方法实现事务管理

    • 对类增加:对类实现事务管理

2.2.1对象类

package per.liyue.spring.jdbc_trancation_annotation;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository; /**
* Created by liyue on 2016/11/30.
*/
@Repositorypublic
class RoleDao
{
private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate)
{
this.jdbcTemplate = jdbcTemplate;
} public void save(String sql)
{
jdbcTemplate.update(sql);
}
}
package per.liyue.spring.jdbc_trancation_annotation;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; /**
* Created by liyue on 2016/11/30.
*/
@Servicepublic
class RoleService
{
@Resource
private RoleDao roleDao; public void setRoleDao(RoleDao roleDao)
{
this.roleDao = roleDao;
} @Transactional
public void save(String sql)
{
roleDao.save(sql);
int i = 10 / 0;//这里执行失败要回滚成功的操
roleDao.save(sql);
}
}

2.2.2配置文件

<?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"
xmlns:aop="http://www.springframework.org/schema/aop"
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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!--1.jdbc的基本配置-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///hi"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="roleDao" class="per.liyue.spring.jdbc_trancation_annotation.RoleDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<bean id="roleService" class="per.liyue.spring.jdbc_trancation_annotation.RoleService">
<property name="roleDao" ref="roleDao"></property>
</bean> <!--2.事务配置--> <!--2.1事务管理器-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean> <!--2.2开启注解扫描-->
<context:component-scan
base-package="per.liyue.spring.jdbc_trancation_annotation"></context:component-scan> <!--2.3开启注解事务模式-->
<tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven>
</beans>

2.3事务的属性

事务对于Dao的操作,这里举例如:

package per.liyue.spring.jdbc_trancation_annotation;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; /**
* Created by liyue on 2016/11/30.
*/
@Servicepublic
class RoleService
{
@Resource
private RoleDao roleDao; public void setRoleDao(RoleDao roleDao)
{
this.roleDao = roleDao;
} @Transactional(readOnly = false, //只读
timeout = -1, //超时,但是最终是由底层数据库来决定
noRollbackFor = ArithmeticException.class, //对于指定异常不执行回滚操作,这里的示例对于数学异常不会滚 )
public void save(String sql)
{
roleDao.save(sql);
int i = 10 / 0;//这里执行失败要回滚成功的操作
roleDao.save(sql);
}
}

propagation:

isolation:


3.

37.Spring-事务控制.md的更多相关文章

  1. SSM框架之Spring(5)JdbcTemplate及spring事务控制

    Spring(5)JdbcTemplate及spring事务控制 ##1.JdbcTmeplate 它是 spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装.spring ...

  2. 【Spring】Spring 事务控制

    Spring 事务控制 Spring 事务控制介绍 JavaEE 体系进行分层开发,事务控制位于业务层,Spring 提供了分层设计业务层的事务处理解决方案. Spring 的事务控制都是基于 AOP ...

  3. spring 事务控制 设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

    //假设这是一个service类的片段 try{ //出现异常 } catch (Exception e) { e.printStackTrace(); //设置手动回滚 TransactionAsp ...

  4. Spring事务控制和回滚

    1在一个项目中ssh结构,spring2.5,事务控制采用的是tx拦截器的方式. 自己写了个 int a=1/0;异常抛出了,但是事务还是提交了,怎么搞都不行. 现将看到的一些事务控制总结下来: 事务 ...

  5. Spring事务控制和传递性理解

    1.在同一类方法间相互调用,如果调用方无事务控制,被调用方有事务控制,则被调用方也无事务 原因:外部经过spring容器调用service的方法事务才生效,service类内部方法间相互调用事务不生效 ...

  6. Spring事务控制

    我们在实际业务场景中,经常会遇到数据频繁修改读取的问题.在同一时刻,不同的业务逻辑对同一个表数据进行修改,这种冲突很可能造成数据不可挽回的错乱,所以我们需要用事务来对数据进行管理. 1. 到底什么是事 ...

  7. 阶段3 2.Spring_10.Spring中事务控制_5 spring事务控制的代码准备

    创建一个工程,只搭建环境不做配置.等配置的时候把这个项目相关的代码再复制到新项目里面 jar包的打包方式 导入包 事务控制也是基于AOP的.所以这里导入aspectjweaver 复制jdbcTemp ...

  8. 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制

    spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...

  9. Spring的事务控制-基于注解的方式

    模拟转账操作,即Jone减少500,tom增加500 如果有疑问请访问spring事务控制-基于xml方式 1.创建数据表 2.创建Account实体类 public class Account { ...

随机推荐

  1. 判断手机是安卓还是ios

    let ORZ = function() { if(!(this instanceof ORZ)) { return new ORZ; }}ORZ.prototype = { // 判断用户手机是An ...

  2. CDMA码片序列问题

    要想知道到底是怎么算的 建议看见这篇博客的任何一位去先看一下这篇博客:https://blog.csdn.net/dog250/article/details/6420427 在CDMA中.每一个比特 ...

  3. leetcode 421.Maximum XOR of Two Numbers in an Array

    题目中给定若干个数,然后任意选定两个数使得其异或值最大. 先利用样例中的: 3 10 5 25 2 8 这些数转换为二进制来看的话那么是先找到最高位的1然后与数组中其他的数相与后的数值保存到set中去 ...

  4. 1.golang的环境搭建及入门

    安装包下载 下载链接:https://dl.google.com/go/go1.12.3.windows-amd64.msi 环境搭建 安装完成之后,找一个来存放go语言文件的文件夹,我这里选的是G: ...

  5. 使用 jest 测试 react component 的配置,踩坑。

    首先安装依赖 npm i jest -g npm i jest babel-jest identity-obj-proxy enzyme enzyme-adapter-react-15.4 react ...

  6. range的新发现

    正向打印的时候 for i in range(2): print(i) 打印的结果 0 1 反向的时候 for i in range(2,-1,-1): print(i) 2 1 0 for i in ...

  7. 给大厨写的R数据分析代码

    ###************************************** 新老客户统计 ***************************************### dachu &l ...

  8. 使用 vue-cli-service inspect 来查看一个 Vue CLI 3 项目的 webpack 配置信息(包括:development、production)

    使用 vue-cli-service inspect 来查看一个 Vue CLI 3 项目的 webpack 配置信息(包括:development.production) --mode 指定环境模式 ...

  9. 初始nginx(启动运行) 使用nginx做一个简单的静态资源服务器

    第一次接触nginx的时候,那时候公司还是用的一些不知名的小技术,后来公司发展问题,重新招了人,然后接触到nginx,公司 使用nginx用来做代理服务器,所有请求 都先经过nginx服务器,然后交由 ...

  10. HDFS知识点总结

    学习完Hadoop权威指南有一段时间了,现在再回顾和总结一下HDFS的知识点. 1.HDFS的设计 HDFS是什么:HDFS即Hadoop分布式文件系统(Hadoop Distributed File ...