spring中的事务管理

一、简单介绍
spring中的事务管理主要是用来管理对数据库进行操作的事务,一般是应用于service层。分为几种:
1.编程式事务管理(如jdbc中设置取消数据库的自动提交功能)
conn=dataSource.getConnection();
conn.setAutoCommit(false);//此处表示取消数据库的自动提交功能,不要每条sql提交一次
... ...//此处是多条sql语句的处理
conn.commit()//在此处统一提交
2.声明式事务管理
多数声明式事务管理要比编程式来的方便,它能够将事务管理代码从业务逻辑中分离出来。例如通过AOP对关注点进行横切管理。可以通过AOP对事务进行管理,在配置文档中进行。
3.更加常用的一种方式是spring中通过注解方式实现

	
		
	
注:事实上当事务管理器名字为transactionManager时,就不需要加transaction-manager属性,此处的事务管理器是 HibernateTransactionManager,针对对象/关系映射框架存取数据库。当然其他的数据管理器还有DataSourceTransaction(针对只有一个数据源)等。
在spring文档中注入了事务管理器之后,代码中应该怎么办呢?
@Transactional(propagation =Propagation.REQUIRED)
public List getAssignmentList(Model model) {
getHibernateTemplate().update(model);
}//注:默认的事务传递方式就是 REQUIRED 方式,因此上面的注解括号里头的可以不用写。
详细如图:
spring中的事务管理_第1张图片
spring中的事务管理
二、下面介绍事务的传递方式

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

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

PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

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

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

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

三、 隔离方式(针对并发问题)
在并发环境中,一个数据库系统会同时为各种各样的客户程序提供服务。对于同时运行的多个事务,当这些事务访问数据库中的相同的数据时候,如果没有采取必要的隔离机制,就会导致各种并发问题,这些并发问题可以归纳为以下几类:
1、第一类丢失更新:撤销一个事务时,把其他事务已经提交的数据覆盖。
2、脏读:一个事务读到另一个事务未提交的更新数据。(即另一个事务最后rollback了)
3、虚读:一个事务读到另一个事务已提交的新插入的数据。
4、不可重复读:一个事务读到另一个事务已提交的更新数据。
5、第二类丢失更新:这是不可重复读中的特例,一个事务覆盖另一个事务已提交的更新。
数据库系统采用锁来实现事务的隔离性。锁的基本原理如下:
1、当一个事务访问数据库资源时,如果执行select语句,必须先获得共享锁;如果执行insert、update、delete语句,必须获得独占锁,这些锁用于锁定被操纵的资源。
2、当第二个事务也要访问数据库中的相同资源时,如果执行select语句,也必须获得共享锁,如果执行insert、update、delete语句,也必须获得独占锁。此时,第二个事务要根据锁的类型来判断应该等待第一个事务解除对资源的锁定,还是可以立刻获得锁。
以下是各种情况:

资源上已经放置锁

第二个事务进行读操作

第二个事务进行写操作

立即获得共享锁

立即获得独占锁

共享锁

立即获得共享锁

等待第一个事务解除独占锁

独占锁

等待第一个事务解除独占锁

等待第一个事务解除独占锁

锁机制可以有效地解决各种并发问题,但是它会影响并发的性能。并发性能越好,数据库系统同时为各种客户提供服务的能力就越强。当一个事务锁定资源时候,其他事务必须等待,这样就降低了数据库系统同时响应客户程序的速度。因此我们要在事务的隔离性和并发性之间做权衡。数据库系统提供了4种事务隔离级别:
1、Serializable:串行化。
一个事物已经访问数据库,那么另一个事务必须停下来等待,等第一个事务结束后才能恢复运行。
2、Repeatable Read:可重复读。
一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他事务已经提交的对已有记录的更新(能看到insert操作,不能看到update操作)。
3、Read Committed:读取已提交数据。
一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经提交的对已有记录的更新(能看到insert操作,也能看到update操作)。最常用。
4、Read Uncommitted:读取未提交数据。
一个事物在执行过程中可以看到其他事务没有提交的新插入的记录,而且能够看到其他事务没有提交的对已有记录的更新。
从1到4,隔离级别越来越低,并发性能越来越高。



























你可能感兴趣的:(spring,java,事务,管理,jdbc,总结)