Spring事务管理

Spring基本的事务概念:

事务的隔离级别: 由于数据库是可以多线程共享的,所以会带来并发的问题,比如脏读,重复读,幻想读等,为此数据库设计了锁机制,一般根据锁的级别分为表级锁,和行级锁。根据具体需要像下分还有几种锁的机制,不过虽然数据库考虑到了这一点,但是操作起来还是很麻烦,所以就产生了自动锁,而事务的隔离级别就是自动锁组合形式。


1、Serializable:最严格的级别,事务串行执行,资源消耗最大;

2、REPEATABLE READ:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。

3、READ COMMITTED:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。

4、Read Uncommitted:保证了读取过程中不会读取到非法数据


当然就算数据库支持事务也不一定会支持事务的隔离级别,所以spring中定义的隔离级别还是会因数据库不同而呈现出不同的表现形式。


事务的传播行为:

Spring中规定了7种事务传播行为,它们规定了事务方法,和事务方法在发生嵌套时如何传播。

PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。


PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。


1)NESTED和NEW的区别

PROPAGATION_REQUIRES_NEW 和
PROPAGATION_NESTED是容易混淆的两个传播行为。PROPAGATION_REQUIRES_NEW
启动一个新的、和外层事务无关的“内部”事务。该事务拥有自己的独立隔离级别和锁,不依赖于外部事务,独立地提交和回滚。当内部事务开始执行时,外部事务
将被挂起,内务事务结束时,外部事务才继续执行。由此可见, PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED
的最大区别在于:PROPAGATION_REQUIRES_NEW 将创建一个全新的事务,它和外层事务没有任何关系,而 PROPAGATION_NESTED
将创建一个依赖于外层事务的子事务,当外层事务提交或回滚时,子事务也会连带提交和回滚。嵌套事务不能够提交,它必须通过外层事务来完成提交的动作,外层事务的回滚也会造成内部事务的回滚。

2)
当方法被设置为PROPAGATION_NOT_SUPPORTED时,外层业务方法的事务会被挂起,当内部方法运行完成后,外层方法的事务重新运行。如果外层方法没有事务,直接运行,不需要做任何其它的事。

3) 当业务方法被设置为PROPAGATION_NEVER时,它将不能被拥有事务的其它业务方法调用。

4) 当业务方法被设置为PROPAGATION_MANDATORY时,它就不能被非事务的业务方法调用。


Spring事务管理的接口:


TranscationDefintion:

对事务控制的若干方面进行配置,比如事务隔离和事务传播等。


PlatformTranctionManager:

主要有三种方法和功能:

getTrancation(TranactionDefinition defintion)

或取一个已经存在的事务

commit(Transaction stuta)


TrancationStatus:

获得事务运行期间的状态,比如事务运行期间抛出异常等信息。


Spring对于其他开源数据存储框架的支持都是在这三个接口的基础上实现的,这里不一一介绍,我的文章中有一篇是关于ibatis和spring结合管理事务的,可以自己去看看。


声明式事务的配置:

1,使用代理

2,使用注解

3,使用切面


我还是习惯使用切面,这样既不会破坏Daobean的结构,也不会为每一个类都手动创建代理,spring3.*后不推荐使用TransactionProxyFactoryBean来配置事务,这里不错介绍。


Spring事务管理中的难点:

待续。。。。。。。。。。


你可能感兴趣的:(spring)