本帖最后由 我是楠楠 于 2018-6-22 16:29 编辑
【郑州校区】Spring 事务管理
案例—转账操作创建一个关于帐户表
[AppleScript] 纯文本查看 复制代码 CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
money DOUBLE
)
INSERT INTO account VALUES(NULL,'tom',1000);
INSERT INTO account VALUES(NULL,'fox',1000);
创建service与dao对于数据的操作使用spring jdbc template 关于service与dao的配置我们让dao去extends JdbcDaoSupport类,这个类中它创建了JdbcTempate,前提是我们需要注入一个dataSource. 在dao中在获取JdbcTemplate可以使用父类提供的getJdbcTemplate方法来获取。 转账操作的问题如果在转账操作过程中出现问题,那么转账会出现问题,结果如下 也就是我们程序需要事务控制。 Spring事务管理机制Spring事务管理的四个优点: 1. 提供一致的对于不同的事务管理的API 2. 支持声明式事务管理(重点) 3. 编程事务管理(在开发中应用比较少) 4. 优秀的整合与Spring的数据访问 我们重点讲解spring的事务管理的相关的API,还有声明式事务管理 Spring事务管理主要提供了三个接口来完成 1. org.springframework.transaction.PlatformTransactionManager 这是一个事务管理器,可以来选择相关的平台(jdbc hibernate jpa…) 2. TransactionDefinition 它定义事务的一些相关信息 例如 隔离 传播 超时 只读 3. TransactionStatus 它主要描述事务具体的运行状态 PlatformTransactionManager平台事务管理器 在不同的持久化层解决技术它的事务代码不一样。 JDBC开发 Connection con=……; con.setAutoCommit(false);//开启事务 con.rollback(); con.commit(); Hibernate开发 Session session=….; Transaction t=session.beginTransaction(); t.commit(); t.rollback(); PlatformTransactionManager接口API DataSourceTransactionManager 主要针对于JdbcTemplate开发 MyBatis开发 HibernateTransactionManasger主要针对于Hibernate开发 JpaTransactionManager 主要针对于JPA开发。 TransactionDefinition它描述的是事务的定义信息。 在TransactionDefinition中定义了大量的常量 隔离以下是关于隔离性相关信息 事务的四个特性 ACID 原子性 一致性 隔离性 持久性。 不考虑事务隔离性有什么问题? 脏读,不可重复读 虚读。 ISOLATION_DEFUALT 它使用后端数据库的默认隔离级别(spring中选项) ISOLATION_READ_UNCOMMITTED 不能解决问题,会发生脏读 不可重复读 虚读 ISOLATION_READ_COMMITTED 可以解决脏读 会产生不可重复读与虚读。 对于不现的数据库,它的底层默认事务隔离级别不一样。 Oracle数据库它默认的是read_committed Mysql数据库它默认的是repeatable_read. 超时默认值是-1 它使用的是数据库默认的超时时间。 只读 它的值有两个true/false,如果选择true一般是在select操作时 传播它解决的是两个被事务管理的方法互相调用问题。它与数据库没关系,是程序内部维护的问题。 以下定义了事务的传播行为 以上操作中最常用的三种: 两个操作处于不同的事务 PROPAGATION_NESTED
它是一种嵌套事务,它是使用SavePoint来实现的。事务回滚时可以回滚到指定的savepoint,注意:它只对DataSourceTransactionManager有作用 以下了解 TransactionStatus它定义了事务状态信息,在事务运行过程中,得到某个时间点的状态 声明式事务管理事务管理方式1. 编码方案 不建议使用,它具有侵入性。在原有的业务代码基础上去添加事务管理代码 2. 声明式事务控制,基于AOP对目标进行代理,添加around环绕通知。 这种方案,它不具有侵入性,不需要修改原来的业务代码 基于xml配置声明式事务管理方案第一步:在applicationContext.xml文件中添加aop与tx的名称空间 第二步:在applicationContext.xml文件中配置 Spring提供的advice是传统的spring advice 1. 声明事务管理器 2. 配置通知 Spring为我们提供了一个TransactionInterceptor来完成增强 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB621.tmp.jpg 对于这个增强,我们可以使用spring为我们提供的一个标签<tx:advice>来完成操作
3. 配置切面 因为使用的是传统的spring的advice,需要使用<aop:advisor> 基于annotation声明式事务管理方案可以使用@Transaction来在类或方法上添加声明式事务管理 注意:需要在applicationContext.xml文件中使用 相当于开启注解事务控制 问题:关于xml方式与annotation方式的优缺点? 从简单上来说,使用注解更方便。 使用配置的方案,可以对事务配置进行集中维护。 传智播客·黑马程序员郑州校区地址 河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层 联系电话 0371-56061160/61/62 来校路线 地铁一号线梧桐街站A口出
|