spring 事务(1)

隐身守侯 提交于 2019-12-01 20:28:15

spring的事务是spring aop应用的典范。本文从以下几个方面入手来看看事务在spring中是如何实现的。

1、事务基础知识

2、spring事务的配置形式有哪些

3、spring事务的关键类

4、问题

#事务基础知识 ##数据库层面的事务 说到事务,我们脑海里就应该出现事务的四个特性

原子性、隔离性、一致性、持久性。 '

四种隔离 级别

1、序列化:串行化

2、可重复读:可重复读(会出现幻读)

3、读已提交:读已提交数据(会出现不可重复读和幻读)

4、读未提交:读未提交数据(会出现脏读,不可重复读和幻读)

##spring层面的事务 spring层面的事务和mysql的事务有所不同。

四个特性

原子性、隔离性、一致性、持久性。

五种隔离级别

  1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.

    另外四个与JDBC的隔离级别相对应

  2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。

    这种隔离级别会产生脏读,不可重复读和幻像读。

  3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据

  4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。

    它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。

  5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最 可靠的事务隔离级别。事务被处理为顺序执行。 除了防止脏读,不可重复读外,还避免了幻像读。

七种传播特性

  1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启。

  2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。

  3. PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

  4. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

  5. PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。

  6. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常。

  7. PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。

spring的事务都是方法级别的。

#spring事务的配置形式有哪些

曾经有一个面试官问spring的事务都有哪些形式的配置?所以平时工作当中不能就配置一种就知道一种。要多多研究其实现原理。

spring的事务Transaction配置有三种形式。

1、直接将bean代理到事务中。主要将我们的接口和实现类注入到TransactionProxyFactoryBean实例中。

2、使用拦截器TransactionInterceptor拦截请求。

3、注解形式

具体配置见文章: http://www.blogjava.net/robbie/archive/2009/04/05/264003.html

#spring事务的关键类

###PlatformTransactionManager

事务管理器接口。所有的事务管理器都要实现该接口。我们一般使用的是

DataSourceTransactionManager。

###TxNamespaceHandler

spring事务的标签解析类。该类初始化了tx标签中的解析类。

	public void init() {
		registerBeanDefinitionParser("advice", new TxAdviceBeanDefinitionParser());
		registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
		registerBeanDefinitionParser("jta-transaction-manager", new JtaTransactionManagerBeanDefinitionParser());
	}

spring事务的配置都需要这些解析类解析,将信息放到对应类的变量中去。

###TransactionDefinition 事务定义。事务的传播特性、隔离特性、只读特性、 超时特性和名称都在该接口类定义了。 实现类DefaultTransactionDefinition将事务的四个 特性指定了默认值。

 	private int propagationBehavior = PROPAGATION_REQUIRED;
	private int isolationLevel = ISOLATION_DEFAULT;
	private int timeout = TIMEOUT_DEFAULT;
	private boolean readOnly = false;

###TransactionStatus 事务状态类。事务的状态都是通过这个类获取。实现类有两个。

1、DefaultTransactionStatus

2、SimpleTransactionStatus

###SavepointManager

断点管理器。创建节点、释放节点和回滚节点操作的集合。 #问题

##问题1

spring管理事务,和数据库的事务有何联系和区别。

说道联系:

spring的事务管理就是将我们平时写的事务代码和事务逻辑封装了。这样spring事务其实是在开发者和数据库之间做了一个封装。spring操作数据库的事务最终实现还是数据库的事务操作。这是事务的逻辑按照我们自己配置的来。

比如:我们配置某个方法的传播特性和隔离级别分别为REQUIRED、 ISOLATION_READ_COMMITTED。那么在执行该方法时候会执行事务拦截器。拦截器会根据我们配置的隔离级别,将connection的隔离级别配置成ISOLATION_READ_COMMITTED,然后在提交连接执行sql。

说道区别:

spring事务里面的传播特性是针对spring自身的方法而言的。spring的传播特性有七种。传播特性是说如果某个受事务管理的方法中又调用了其他方法,那个方法也要涉及到sql执行的操作,那么事务如何处理。

int PROPAGATION_REQUIRED = 0;

执行当前事务,如果当前没事务则创建一个新事物执行。 

int PROPAGATION_SUPPORTS = 1; 

执行当前事务,如果当前无事务就按照当前的执行。

int PROPAGATION_MANDATORY = 2; 

 支持当前事务,如果当前无事务则抛异常。 

 int PROPAGATION_REQUIRES_NEW = 3; 

 创建新的事务,如果当前有事务则将当前事务挂起。 

 int PROPAGATION_NOT_SUPPORTED = 4; 

 不支持当前事务,非事务形式执行。 

 int PROPAGATION_NEVER = 5; 

 不支持当前事务,如果当前有事务则抛异常。 

int PROPAGATION_NESTED = 6;

当前事物存在,则在当前事务的嵌套事务中执行。

##问题2 spring里面的事务的组织思想

spring的事务是针对方法级别的。这一点可以从TransactionInterceptor实现了MethodInterceptor接口中看出来。

spring的事务配置也是多种多样的。我们

可以使用它的事物模板TransactionTemplate。

可以使用注解标签tx:annotation-driven。

可以使用事务代理类 TransactionProxyFactoryBean。

可以使用aop配置切面advice和拦截点(pointcut)。

不管哪个最后都要先走事务拦截器去初始化一个连接。后续hibernate或者mybatis都需要找到这个连接去执行sql。在执行sql后,无论跑错误也好还是正常执行也好都是需要根据我们配置的事务特性进行后续操作。

参考文献 http://www.blogjava.net/robbie/archive/2009/04/05/264003.html

http://blog.csdn.net/yaerfeng/article/details/28390773

http://www.linuxidc.com/Linux/2011-12/50178.htm

http://www.cnblogs.com/dyllove98/archive/2013/06/25/3155413.html

欢迎加入qq群: 122567875 欢迎关注微信公众号:hyssop的后花园

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