spring事务管理(有实例)

最近在学习spring框架,想将学习心得记录一下,每天进步一点点。

一、什么是事务(transaction)?

     事务是指单个的工作单元。说到事务我们一般会联想到和数据有关,拿数据库事务来说,一个数据库事务就是一个单一的工作单元的操作序列,这些操作要么完整的执行,要么完全不执行。事务就是为了保证数据的完整性和一致性。

二、事务的ACID属性

 1.原子性(Atomicity)

原子性是指事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。 

 可以简单的理解为耳熟能详的例子“A向B转账”,在DBMS(Database Management System 数据库管理系统)中默认情况下,一个sql就

是一个单独事务,事务是会自动提交的。只有显式的使用start transaction开启一个事务,才能讲一个代码块放在事务中执行。

2.一致性(Consistency

一致性是指在事务开始之前和事务结束以后数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性

3.隔离性Isolation

多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。

在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。

事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据

4.持久性Durability

这是最好理解的一个特性:持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

(完成的事务是系统永久的部分,对系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持)


三、spring事务管理

spring事务管理有两种方式:编程式事务管理和声明式事务管理

1.编程式事务管理:这意味着你在编程的帮助下有管理事务。这给了你极大的灵活性,但却很难维护。

2.声明式事务管理:这意味着你从业务代码中分离事务管理。你仅仅使用注释或 XML 配置来管理事务。

声明式事务管理比编程式事务管理更可取,尽管它不如编程式事务管理灵活,但它允许你通过代码控制事务。但作为一种横切关注点,

声明式事务管理可以使用 AOP 方法进行模块化。Spring 支持使用 Spring AOP 框架的声明式事务管理

四、下面就spring声明式管理的方式创建一个spring配置demo

1.demo需要的jar包括:spring-framework-x.x.x.RELEASE(3.5以上的为好),aopalliance-1.0.jar,aspectjweaver-1.7.3.jar

 org.springframework.transaction-3.x.x.RELEASE.jar,commons-logging-1.2.jar,mysql-connector-java.jar

2.IDE myeclipse

3.demo结构如图:

 

现在让我们编写 Spring JDBC 应用程序来在 Student 和 Marks 表中实现简单的操作。让我们适当的使用 Eclipse IDE,并按照如下所示的步骤来创建一个 Spring 应用程序:

步骤 描述
1 创建一个名为 SpringExample 的项目,并在创建的项目中的 src 文件夹下创建包 springtransaction
2 使用 Add External JARs 选项添加必需的 Spring 库,解释见 Spring Hello World Example chapter.
3 在项目中添加其它必需的库 mysql-connector-java.jarorg.springframework.jdbc.jar 和 org.springframework.transaction.jaraopalliance-1.0.jar,aspectjweaver-1.7.3.jar如果你还没有这些库,你可以下载它们。
4 创建 DAO 接口 StudentDAO 并列出所有需要的方法。尽管它不是必需的并且你可以直接编写 StudentJDBCTemplate 类。
5 在springtransaction  包下创建其他必需的 Java 类 StudentMarksStudentMarksMapperStudentJDBCTemplate 和 MainApp。如果需要的话,你可以创建其他的 POJO 类。
6 确保你已经在 TEST 数据库中创建了 Student 和 Marks 表。还要确保你的 MySQL 服务器运行正常并且你使用给出的用户名和密码可以读/写访问数据库。
7 在 src 文件夹下创建 Beans 配置文件 springtransaction.xml 。
8 最后一步是创建所有 Java 文件和 Bean 配置文件的内容并按照如下所示的方法运行应用程序。
下面是model实体类:


以下是访问数据库StudentDao.java对象接口文件:

 


以下是StudentMarksMapper.java文件

 

 以下是StudenDao的实现类StudentJDBCTemplate.java

  

以下是springtransaction.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: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-3.0.xsd 
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
   
   <!-- 配置jdbc连接 -->
   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://localhost:3306/mytest"/>
      <property name="username" value="root"/>
      <property name="password" value="admin"/>
   </bean>
    <!-- 配置声明式事务 -->
   <!-- 配置方面 -->
   <tx:advice id="advice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="create"/>
    </tx:attributes>
   </tx:advice>
   
    <aop:config>
    <aop:pointcut expression="execution(* springtransaction.dao.impl.StudentJDBCTemplate.create(..))" id="createOperation"/>
    <aop:advisor advice-ref="advice" pointcut-ref="createOperation"/>
   </aop:config>
   <!-- 配置事务管理器 -->
   <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
   </bean>
   <!-- 将dataSource对象依赖注入到StudentJDBCTemplate的set属性中-->
   <bean id="studentJDBCTemplate" class="springtransaction.dao.impl.StudentJDBCTemplate">
    <property name="dataSource" ref="dataSource"></property>
   </bean>
  
   
  
 </beans>  

以下是main()测试类


运行程序可以在mysql数据库添加数据如下:


控制台输出数据如下:

 

总结:在学习spring声明式事务中遇到过的问题如下:

1.在配置aop时运行报错,因为缺少aopalliance-1.0.jar,aspectjweaver-1.7.3.jar两个jar










 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值