事务:在计算机中 ,一般是指对数据库进行的一系列操作
它有四个特性:1:原子性:指事务包含的所有操作,要么全部执行,要么全都不执行
2:持久性:事务一旦没提交了 ,他对数据库数据产生的影响是永久的
3:一致性:事务执行前后 都得处于一直状态,就好比转账 两边的钱加起来要相等
4:隔离性:当多个用户并发访问数据库时,比如操作同一张表,数据库为每一个用户开启一 个事务,
不能被其它事务所干扰,多个并发事务之间要相互隔离,即对于任意两个事务t1 和t2,在事务t1看来 ,t2要么在t1开始之前就结束了,要么在t1结束之后再开始
spring对事务进行管理:一般有两种方式,一种是编码式的 (可以用springAOP实现),一种是声明式的, 而声明式的又分为两种,一种是基于注解的,一种是基于配置文件的,我们这里就讲解一下啊声明式的
基于注解的方式:在spring配置文件里边配置:
<tx:annotation-driven />//声明注解起作用了
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />//数据源的配置
</bean>
然后在方法上或者类上就可以使用@transactional注解了,这个注解有很多属性
比如:name:用于指定用的那个transactionManage,
isolation:事务的隔离度
propagation:事务的传播 默认值为REQUIRED
rollback-for:用于指定那些异常要发生回滚
注意:如果一个方法没有声明他是事务管理的 那么他调用事务管理的方法 ,事务管理的方法也不会对事务进行管理的.
基于配置文件的(通过aop)
<!-- 事物切面配置 -->
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
<tx:method name="insert" propagation="REQUIRED" read-only="false"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="testService" expression="execution (* com.baobao.service.MyBatisService.*(..))"/>
<aop:advisor advice-ref="advice" pointcut-ref="testService"/>
</aop:config>