java-事务定义以及分类

一,什么是事务

就是一组操作数据库的动作集合,事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交。由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态。

二,为什么用用到事务

假如你有一个数据库操作,需要同时插入数据到多张表中,需要统一的进行提交或回滚,这样可以保证数据操作会同时成功或失败,保证数据的完整性.

三,事务的特征

ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。

事务的原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。

隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。

持久性表示一个事务一旦被提交,它对数据库中数据的改变就是永久性的.即使系统重启也不会丢失。

四,事务分类

java角度

根据规范分为JDBC事务和JTA事务

JDBC事务:普通事务,即数据库事务中的本地事务,通过connection对象控制管理。

JTA事务:JTA指Java事务API(Java Transaction API),是Java EE数据库事务规范, JTA只提供了事务管理接口,由应用程序服务器厂商(如WebSphere Application Server)提供实现,JTA事务比JDBC更强大,支持分布式事务(当然也支持本地事务)。

编程角度(Spring层面)

根据是否通过编程分为声明式事务和编程式事务

声明式事务:通过XML配置或者注解实现,更为简单

编程式事务:通过编程代码在业务逻辑时需要时自行实现,粒度更小。

声明式事务:

声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中;声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。

@Transactional注解的用法

 @Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。

         虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。

        默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。
类,当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性。

@Transactional的使用实例:

@Autowired

 private FilterDao filterDao;

@Transactional

public void saveFilter(Filter filter) {

    filterDao.saveFilterRoles(filter.roles);  //It will access the roles table of DB

    filterDao.saveFilterRef(filter.ref); //It will access the ref table of DB

}

以MyBatis为例,基于tx和aop名字空间的xml配置

1. <!-- 配置sessionFactory -->

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="mapperLocations"  >
            <list>
                <value>classpath:com/sojson/common/mapper/*.xml</value>
            </list>
        </property>
    </bean>

2. <!-- 配置事务管理器 -->

 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         <property name="dataSource" ref="dataSource" />
     </bean>

3. <!--配置事务特性-->

<tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="publish*" />
            <tx:method name="save*" />
            <tx:method name="add*" />
            <tx:method name="update*" />
            <tx:method name="insert*" />
            <tx:method name="create*" />
            <tx:method name="del*" />
            <tx:method name="load*" />
            <tx:method name="init*" />
            <tx:method name="*"  read-only="true"/>
        </tx:attributes>
    </tx:advice>

4. <!--配置哪些类的哪些方法配置事务-->

<aop:config>
        <aop:pointcut id="myPointcut"
            expression="execution(public * com.sojson.*.service.impl.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" />
    </aop:config>

我解释一下(* com.evan.crm.service.*.*(..))中几个通配符的含义: 
第一个 * : 通配 任意返回值类型 
第二个 * :通配 包com.evan.crm.service下的任意class 
第三个 * :通配 包com.evan.crm.service下的任意class的任意方法 
第四个 ..  通配 方法可以有0个或多个参数 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值