Spring事务管理

Spring是当前最流行的框架之一,事务管理是我们开发时要处理的主要问题之,来看看Spring是如何让我们从枯燥无聊的事务管理代码中脱离出来。

首先我们需要了解数据库关于事务方面的知识,这里做个简单描述:

数据库事务必须同时满足4个特性:原子性(Atomic),一致性(Consistency),隔离性(Isolation),持久性(Durabiliy)

1.事务隔离级别

ANSI/ISO SQL 92定义了4个等级的事务隔离级别

隔离级别脏读不可重复读幻象读第一类丢失更新第二类丢失更新
READ_UNCOMMITEDYYYNY
READ_COMMITEDNYYNY
REPEATABLE_READNNYNN
SERIALIZABLENNNNN
事务的隔离级别和数据库并发性是对立的,一般来说, READ_UNCOMMITED级别的数据库拥有最高的吞吐量和并发性,SERIALIZABLE最低。

并不是所有的数据库都支持事务或者支持所有的事务隔离级别,在Java使用JDBC连接数据库时,我们可以根据Connection的getMetaData获取一个DataBaseMetaData对象,并可以通过该对象的supportsTransactions(),supportsTransactionIsolationLevel(int level)查看数据库对事务支持的情况。

Connection是默认提交的,即一条SQL对应一个事务,在程序中为了保持数据的一致性,我们一般需要讲autoCommit设置为false,当所有操作完成/出现异常时进行显式的Commit/rollback操作。

2.Spring的事务传播机制

Spring是如何管理两个都具有事务的方法呢?Spring的事务传播机制为我们详细的介绍了Spring是如何管理这种状况的,开发者可以根据情况选择需要的传播行为

<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务,如果已存在事务,就加入当前事务(最常使用的一种)。</span></div><div style="text-align: left;"><span style="text-align: center; font-family: Arial, Helvetica, sans-serif;">PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。</span></div><div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。</span></div><div style="text-align: left;"><span style="text-align: center; font-family: Arial, Helvetica, sans-serif;">PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。</span></div><div style="text-align: left;"><span style="text-align: center; font-family: Arial, Helvetica, sans-serif;">PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。</span></div><div style="text-align: left;"><span style="text-align: center; font-family: Arial, Helvetica, sans-serif;">PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。</span></div><div style="text-align: left;"><span style="text-align: center; font-family: Arial, Helvetica, sans-serif;">PROPAGATION_NE</span><span style="font-family: Arial, Helvetica, sans-serif;">STED--如果当前存在事务,则在嵌套事务内执行,如果没有事务则执行PROPAGATION_REQUIRED类似的操作</span></div>
Spring默认的事务传播行为是PROPAGATION_REQUIRED,也是我们使用最多的情况,它适合绝大多数的情况

3.Spring的声明式事务

为什么我们要选择声明式事务?因为这种方式对代码的入侵性最小,可以使事务管理代码完全从业务代码中剥离,用过Spring声明式事务管理的开发人员都可以清晰的感觉到,在业务代码中没有一丝关于获取线程绑定,开始事务,提交/回滚事务,异常转换的处理的代码

说到这里我们就不能不说说AOP了,因为SPring的事务管理代码就是通过AOP的方式在程序的运行期间动态的编织到我们需要进行事务管理的方法中去的。

下面来让我们看一个关于声明式事务的配置

4.Spring单实例化bean

Spring的事务管理器是通过线程相关的ThreadLocal来保存Connection实例,再结合IOC和AOP实现对声明式事务的管理

Web容器本身即是多线程的,当接收到一个用户请求会创建一个独立的线程,所涉及到的Spring容器中的bean也是要运行在多线程的环境下,Spring的bean大多是单实例的(singleton),单实例的bean最大的好处是线程无关,不存在多线程并发问题。一个类能以单实例方式运行的前提是“无状态”(不能拥有成员变量,运行在多线程下的类的成员变量被线程所共享)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值