spring 事务管理是通过AOP拦截指定的方法,进行事务管理。

事务配置

<aop:config proxy-target-class="true">
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.redxun.*.*.manager..*(..))" />
</aop:config>

<tx:advice id="txAdvice" transaction-manager="jpaTranManager">
        <tx:attributes>
            <tx:method name="genSequenceNo" propagation="REQUIRES_NEW" isolation="READ_COMMITTED"/>
            <tx:method name="del*" propagation="REQUIRED" isolation="READ_COMMITTED" />
            <tx:method name="add*" propagation="REQUIRED" isolation="READ_COMMITTED" />
            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
</tx:advice>
pointcut:切入点
tx:method: 对事务方法定义

 

参数名 备注
name 
定义事务的方法名称,名称可以支持通配符

propagation
事务传播性
isolation
 事务隔离级别
readonly
事务是否只读

事务传播性:

propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作

事务隔离级别:

read uncommited:是最低的事务隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。
read commited:保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。
repeatable read:这种事务隔离级别可以防止脏读,不可重复读。但是可能会出现幻象读。它除了保证一个事务不能被另外一个事务读取未提交的数据之外还避免了以下情况产生(不可重复读)。
serializable:这是花费最高代价但最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读之外,还避免了幻象读。

 

脏读、不可重复读、幻象读概念说明:
脏读:指当一个事务正在访问数据,并且对数据进行了修改,而这种数据还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据还没有提交那么另外一个事务读取到的这个数据我们称之为脏数据。依据脏数据所做的操作肯能是不正确的。
不可重复读:指在一个事务内,多次读同一数据。在这个事务还没有执行结束,另外一个事务也访问该同一数据,那么在第一个事务中的两次读取数据之间,由于第二个事务的修改第一个事务两次读到的数据可能是不一样的,这样就发生了在一个事物内两次连续读到的数据是不一样的,这种情况被称为是不可重复读。
幻象读:一个事务先后读取一个范围的记录,但两次读取的纪录数不同,我们称之为幻象读(两次执行同一条 select 语句会出现不同的结果,第二次读会增加一数据行,并没有说这两次执行是在同一个事务中)

readonly

是否只读,设置了这个属性为true,那么这个链接为只读,不允许数据编辑。

 

posted on 2018-10-10 22:45  自由港  阅读(237)  评论(0编辑  收藏  举报