事务的配置

1.什么是事务

指作为单个逻辑工作单元(Service方法)执行的一系列操作(数据库操作),要么完全地执行,要么完全地不执行。事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败。

2.事务的四大特性

事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)四个特性,简称 ACID,缺一不可。

  1. 原子性:不可分割,一个事务就是一个最小的无法分割的独立单元,不允许部分成功部分失败
  2. 一致性:保证事务前后的数据完整性保持一致
  3. 隔离性:一个事务的执行不能被其他事务干扰
  4. 持久性:事务一旦提交则不可逆,它对数据库中数据的改变就是永久性的

添加事务到数据库后,当我们添加同时添加多个数据时,根据事务的特性,如果其中一个失败则都失败,不存在一部分添加成功了,一部分添加失败。

如下:

书写两个添加方法

    public int insert(Cities cities){return jdbcTemplate.update("insert into cities values(null,?,?)",cities.getCname(),cities.getPid());}public int insert1(Cities cities){return jdbcTemplate.update("insert into cities values(?,?,?)",cities.getCid(),cities.getCname(),cities.getPid());}

添加service类

import com.cqucc.dao.CitiesDao;
import com.cqucc.pojo.Cities;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class CitiesService {@Autowiredprivate CitiesDao citiesDao;public void insertTest(){Cities cities1 = new Cities("四川",0);citiesDao.insert(cities1);Cities cities2 = new Cities(1,"云南",0);citiesDao.insert1(cities2);}
}

打开数据库可以发现cid为1的已经存在

测试方法

    @Testpublic void Test2(){ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans3.xml");CitiesService bean = context.getBean(CitiesService.class);bean.insertTest();}

运行测试方法会给我们报错

再次打开数据课可以发现一个添加成功了,一个没有,不是我们想要的结果。我们添加事务对齐约束。

3.通过注解的方式添加事务

创建配置xml文件

<?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:aop="http://www.springframework.org/schema/aop"xmlns:c="http://www.springframework.org/schema/c"xmlns:util="http://www.springframework.org/schema/util"xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--数据库的配置--><context:component-scan base-package="com.cqucc"></context:component-scan><context:property-placeholder location="classpath:db.properties"></context:property-placeholder><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driverClassName}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean><bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!-- 使用@Transactional 注解必须开启配置--><bean class="org.springframework.jdbc.support.JdbcTransactionManager" id="transactionManager"><property name="dataSource" ref="dataSource"></property></bean><!-- 使用@Transactional 注解必须开启配置--><tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
</beans>

在service层添加@Transactional实现事务

import com.cqucc.dao.CitiesDao;
import com.cqucc.pojo.Cities;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
@Transactional
public class CitiesService {@Autowiredprivate CitiesDao citiesDao;public void insertTest(){Cities cities1 = new Cities("四川",0);citiesDao.insert(cities1);Cities cities2 = new Cities(1,"云南",0);citiesDao.insert1(cities2);}
}

将数据还原,再次进行测试,还是包相同的错误

打开数据库可以发现这一次都没有插入成功

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:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:c="http://www.springframework.org/schema/c"xmlns:util="http://www.springframework.org/schema/util"xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--数据库的配置--><context:component-scan base-package="com.cqucc"></context:component-scan><context:property-placeholder location="classpath:db.properties"></context:property-placeholder><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driverClassName}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean><bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!-- 使用@Transactional 注解必须开启配置--><bean class="org.springframework.jdbc.support.JdbcTransactionManager" id="transactionManager"><property name="dataSource" ref="dataSource"></property></bean>
<!--       &lt;!&ndash; 使用@Transactional 注解必须开启配置&ndash;&gt;-->
<!--       <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>--><tx:advice transaction-manager="transactionManager" id="advice"><tx:attributes><tx:method name="*/"/><!--将所有的方法配置事务--></tx:attributes></tx:advice><aop:config><aop:pointcut id="point" expression="execution(* com.cqucc.service.*.*(..))"/><aop:advisor advice-ref="advice" pointcut-ref="point"/></aop:config>
</beans

同样进行测试和通过注解方式情况一致,这里就不书写测试案例。

整合mybatis

1.创建mybatis文件mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><typeAliases><package name="com.cqucc.pojo"/></typeAliases></configuration>

2.创建Dao接口


public interface CitiesDao {public void insert(Cities cities);public List<Cities> selectAll();
}

3.配置Dao的xml文件

位置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cqucc.dao.CitiesDao"><insert id="insert">Insert into cities values(null,#{cname},#{pid})</insert><select id="findAll" resultType="com.cqucc.pojo.Cities">select * from cities</select>
</mapper>

4.创建业务层Service接口

import com.cqucc.pojo.Cities;import java.util.List;public interface CitiesService {public void insert(Cities cities);public List<Cities> selectAll();
}

5.创建Service的实现类

@Service
public class CitiesServiceImpl implements CitiesService {@Autowiredprivate CitiesDao citiesDao;@Overridepublic void insert(Cities cities) {citiesDao.insert(cities);}@Overridepublic List<Cities> selectAll() {return citiesDao.selectAll();}
}

6.配置Spring的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><context:component-scan base-package="com.cqucc"></context:component-scan><context:property-placeholder location="classpath:db.properties"/><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driverClassName}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean><!-- 设置jdbc配置 --><bean id="transactionManager" class="org.springframework.jdbc.support.JdbcTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><property name="configLocation" value="classpath:mybatis-config.xml"></property><property name="mapperLocations" value="classpath:cqucc/dao/CitiesDao.xml" ></property></bean><tx:advice transaction-manager="transactionManager" id="txAdvice"><tx:attributes><tx:method name="*"/></tx:attributes></tx:advice><aop:config><aop:pointcut expression="execution(* com.cqucc.service.Impl.*.*(..))" id="point"/><aop:advisor advice-ref="txAdvice" pointcut-ref="point"/></aop:config><bean  id="sessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"><!-- <constructor-arg  name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg> --><constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg></bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.cqucc.dao"></property><property name="sqlSessionTemplateBeanName" value="sessionTemplate"></property></bean></beans>

7.测试

    @Testpublic void Test8(){ApplicationContext context = new ClassPathXmlApplicationContext("beans5.xml");SqlSession sqlSession = context.getBean(SqlSession.class);CitiesDao mapper = sqlSession.getMapper(CitiesDao.class);List<Cities> cities = mapper.selectAll();for (Cities c : cities){System.out.println(c);}}

Spring—事务配置及mybatis整合相关推荐

  1. SSM框架终极篇——Spring、SpringMVC、MyBatis整合练习(超级详细)

    SSM框架终极篇--Spring.SpringMVC.MyBatis整合练习 一.准备工作 环境: 新版IDEA MySQL 5.7 Tomcat 9.0.2 Maven 要求: 熟练掌握MySQL数 ...

  2. Spring事务配置的五种方式 说明

    Spring事务配置的五种方式  [转 http://blog.csdn.net/hjm4702192/article/details/17277669] Spring配置文件中关于事务配置总是由三个 ...

  3. Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别、不可重复读与幻读的区别

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spr ...

  4. spring事务配置,声明式事务管理和基于@Transactional注解的使用

    事务管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring提供了几个关于事务处理的类: TransactionDefinition //事务属性定义 Transc ...

  5. Spring事务配置实例

    事务 一个使用 MyBatis-spring 的主要原因是它允许MyBatis 参与到 Spring 的事务管理中.而 不是给 MyBatis 创建一个新的特定的事务管理器,MyBatis-Sprin ...

  6. 6、Spring事务配置上篇

    一.事务简介 1.概述 1.事务在逻辑上一组操作,要么都执行(成功),要么都不执行(失败),主要是针对数据库而言的,比如MySQL.Oracle等. 2.事务是数据库提供的特性,因此可以直接通过操作数 ...

  7. SSH深度历险(六) 深入浅出----- Spring事务配置的五种方式

    这对时间在学习SSH中Spring架构,Spring的事务配置做了具体总结.在此之间对Spring的事务配置仅仅是停留在听说的阶段,总结一下.总体把控.通过这次的学习发觉Spring的事务配置仅仅要把 ...

  8. spring事务配置

    2019独角兽企业重金招聘Python工程师标准>>> 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识. ...

  9. Spring 事务配置5种方式

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...

  10. 7、Spring事务配置下篇

    一.事务细节-七种传播行为 1.概述 1.事务的传播行为是Spring的特性,它指的是多个事务方法之间相互调用时,事务如何在这些方法之间的传播.比如一个事务方法里面调用了另外一个事务方法,那么两个方法 ...

最新文章

  1. php麻将机器人ai算法,高性能麻将AI算法
  2. [BZOJ2179]FFT快速傅立叶
  3. java中对象模型与数据库中的关系模型
  4. C++ 11 新特性: constexpr变量和constexpr函数
  5. 2019测试指南-测试测试原理
  6. FileUpload路径
  7. manifest.mf._MANIFEST.MF和feature.xml版本控制规则
  8. Linux 初始化系统(系统服务管理和控制程序/Init System) -- System V init(SysV init) 的简单理解
  9. Beyond Compare配置
  10. python两人一碰_python运用pygame库实现双人弹球小游戏
  11. 最小生成树——普里姆算法和克鲁斯卡尔算法
  12. linux用户组登录,linux用户和用户组
  13. arm linux 中断优先级,ARM中断处理过程
  14. 【ES6(2015)】Proxy
  15. 三江学院计算机答辩严格,三江学院论文答辩
  16. mysql groupby php_php – MySQL,GroupBy OrderBy
  17. 编译原理拉链回填技术c语言,编译原理 第1、2、3、4章复习(期末).doc
  18. 图像识别技术原理和神经网络的图像识别技术
  19. 一文讲解5G、互联网、物联网、大数据、人工智能的关系
  20. 如何降低开关电源空载损耗

热门文章

  1. mutiget FlashGot
  2. 营救公主的100种方法
  3. 第八十六章 Caché 函数大全 $ZDATETIMEH 函数
  4. AD 屏蔽原理图中的器件
  5. java 检测表情符号_java 过滤表情符号
  6. 智商太低,居然算不出病狗神题了
  7. 嵌入式系统开发-麦子学院(3)——Linux C初级编程1
  8. Python tkinter(2)深入聊聊窗口
  9. java redis锁_Java中Redis锁的实现
  10. 凯利公式(庄家必胜篇)——致放假在家的高薪程序员们