Spring框架-Java(3)

北慕城南 提交于 2019-12-24 16:18:13

事务管理

回顾事务
  1. 事务:一组业务操作ABCD,要么全部成功,要么全部不成功。
  2. 特性:ACID
    原子性:整体
    一致性:完成
    隔离性:并发
    持久性:结果
  3. 隔离问题:
    脏读:一个事务读到另一个事务没有提交的数据
    不可重复读:一个事务读到另一个事务已提交的数据(update)
    虚读(幻读):一个事务读到另一个事务已提交的数据(insert)
  4. 隔离级别:
    read uncommitted:读未提交。存在3个问题
    read committed:读已提交。解决脏读,存在2个问题
    repeatable read:可重复读。解决:脏读、不可重复读,存在1个问题。
    serializable :串行化。都解决,单事务。
mysql 事务操作--简单

ABCD 一个事务
Connection conn = null;
try{
  //1 获得连接
  conn = ...;
  //2 开启事务
  conn.setAutoCommit(false);
  A
  B
  C
  D
  //3 提交事务
  conn.commit();
} catche(){
  //4 回滚事务
  conn.rollback();
}

mysql 事务操作--Savepoint

需求:AB(必须),CD(可选) 
Connection conn = null;
Savepoint savepoint = null;  //保存点,记录操作的当前位置,之后可以回滚到指定的位置。(可以回滚一部分)
try{
  //1 获得连接
  conn = ...;
  //2 开启事务
  conn.setAutoCommit(false);
  A
  B
  savepoint = conn.setSavepoint();
  C
  D
  //3 提交事务
  conn.commit();
} catche(){
  if(savepoint != null){   //CD异常
     // 回滚到CD之前
     conn.rollback(savepoint);
     // 提交AB
     conn.commit();
  } else{   //AB异常
     // 回滚AB
     conn.rollback();
  }
}

事务管理介绍

1.导入jar包
2.三个顶级接口

PlatformTransactionManager  平台事务管理器,spring要管理事务,必须使用事务管理器
	进行事务配置时,必须配置事务管理器。
TransactionDefinition:事务详情(事务定义、事务属性),spring用于确定事务具体详情,
	例如:隔离级别、是否只读、超时时间等
	进行事务配置时,必须配置详情。spring将配置项封装到该对象实例。
TransactionStatus:事务状态,spring用于记录当前事务运行状态。例如:是否有保存点,事务是否完成。
	spring底层根据状态进行相应操作。

** PlatformTransactionManager 事务管理器**

常见的事务管理器
	DataSourceTransactionManager  ,jdbc开发时事务管理器,采用JdbcTemplate
	HibernateTransactionManager,hibernate开发时事务管理器,整合hibernate

api详解
TransactionStatus getTransaction(TransactionDefinition definition) ,事务管理器 通过“事务详情”,获得“事务状态”,从而管理事务。
void commit(TransactionStatus status)  根据状态提交
void rollback(TransactionStatus status) 根据状态回滚

整合Junit

导入jar包
基本 :4+1 
测试:spring-test...jar

1.让Junit通知spring加载配置文件
2.让spring容器自动进行注入

修改测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class TestApp {
	
	@Autowired  //与junit整合,不需要在spring xml配置扫描
	private AccountService accountService;
	
	@Test
	public void demo01(){
//		String xmlPath = "applicationContext.xml";
//		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
//		AccountService accountService =  (AccountService) applicationContext.getBean("accountService");
		accountService.transfer("jack", "rose", 1000);
	}

}

整合Web

  1. 导入jar包
    spring-web.xml

  2. tomcat启动加载配置文件
    servlet --> init(ServletConfig) --> 2
    filter --> init(FilterConfig) --> web.xml注册过滤器自动调用初始化
    listener --> ServletContextListener --> servletContext对象监听
    spring提供监听器 ContextLoaderListener --> web.xml …
    如果只配置监听器,默认加载xml位置:/WEB-INF/applicationContext.xml

  3. 确定配置文件位置,通过系统初始化参数
    ServletContext 初始化参数 web.xml

    contextConfigLocation
    classpath:applicationContext.xml

 <!-- 确定配置文件位置 -->
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  
  <!-- 配置spring 监听器,加载xml配置文件 -->
  <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  1. 从servletContext作用域 获得spring容器 (了解)
// 从application作用域(ServletContext)获得spring容器
		//方式1: 手动从作用域获取
		ApplicationContext applicationContext = 
				(ApplicationContext) this.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
		//方式2:通过工具获取
		ApplicationContext apppApplicationContext2 = 
				WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
		

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!