spring 事务
原文链接:http://blog.csdn.net/zq9017197/article/details/6321391
一.
spring支持声明式事务和编程式事务。
spring使用事务管理器,每个不同平台的事务管理器都实现了接口:PlatformTransactionManager,此接口是事务管理的核心,提供了三个需要实现的函数:
commint(TransactionStatus status)
getTransaction(TransactionDefinition definition)
rollback(TransactionStatus status)
1.JDBC处理事务,那么事务管理器就是 DataSourceTransactionManager
2.
2.1 TransactionTemplate中有一个重要的方法execute(TransactionCallback action)
就是给这个方法中添加事务,这个方法需要的参数是TransactionCallback(这是一个接口)
2.2 TransactionCallback中有一个方法doInTransaction(TransactionStatus status)
在一个事务中需要做的事情都包括在这个方法中。而这个方法又传入一个参数,就是TransactionStatus,就是事务状态。
当需要回滚的时候,需要在调用 setRoolbackOnly(); 就OK了。
好了,走了这么久,现在就来简单总结一下编程式事务管理。
首先: 因为我们使用的是特定的平台,所以,我们需要创建一个合适我们的平台事务管理PlateformTransactionManager。如果使用的是JDBC的话,就用DataSourceTransactionManager。注意需要传入一个DataSource,这样,平台才知道如何和数据库打交道。
第二: 为了使得平台事务管理器对我们来说是透明的,就需要使用 TransactionTemplate。使用TransactionTemplat需要传入一个 PlateformTransactionManager 进入,这样,我们就得到了一个 TransactionTemplate,而不用关心到底使用的是什么平台了。
第三: TransactionTemplate 的重要方法就是 execute 方法,此方法就是调用 TransactionCallback 进行处理。
也就是说,实际上我们需要处理的事情全部都是在 TransactionCallback 中编码的。
第四: 也就是 TransactionCallback 接口,我们可以定义一个类并实现此接口,然后作为 TransactionTemplate.execute 的参数。把需要完成的事情放到 doInTransaction中,并且传入一个 TransactionStatus 参数。此参数是来调用回滚的。
也就是说 ,PlateformTransactionManager 和 TransactionTemplate 只需在程序中定义一次,而TransactionCallback 和 TransactionStatus 就要针对不同的任务多次定义了。
二.
只读事务和没有事务
Oracle默认情况下(没有事务) 保证了SQL语句级别的读一致性,即在一条SQL语句执行期间,它只会看到执行前点的数据状态,而不会看到执行期间数据被其他SQL改变的状态。
所以如果执行多条SQL的时候呢?比如你做一个报表查询,在执行完第一条sql的时候,执行第二条查询SQL,而这个之间有数据被改变了,第二条数据查询就有可能不一致
而Oracle的只读查询则保证了事务级别的读一致性,即在该事务范围内执行的多条SQL都只会看到执行前点的数据状态,而不会看到事务期间的任何被其他 SQL改变的状态。
没有事务的时候,在执行一条sql语句看到执行前点的数据状态,保证数据一致性
只读事务,在执行多条sql语句看到执行前点的数据状态,保证数据一致性
一致性读是oracle区别于其他数据库的重要特点之一,但一般来说,这个一致性读是sql级别的,只针对单个sql有效。
由于业务逻辑需要,我们可能需要在一个事务中的多个sql实现读一致性,也就是说,数据源在事务开始时就定下来了,不受其他会话影响。如:机票代售点每天18点开始统计一天的销售情况,此时就可以使用只读事务。oracle的只读事务可以实现这个功能,它可以在事务级别上实现读一致性。