spring 事物管理
什么是事务:事务就是逻辑上的一组操作,这组操作的各个执行单元,要么全部完成,要么全部失败,体现在代码中,可以将一次转账看作是一个事务。
事务的特性:
1.原子性
即组成事务的一组操作,要么全部执行,要么全部不执行,不能单独的进行某个操作。
2.一致性
即事务执行前后,数据库中的数据保持一致
3.隔离性
即事务之间相互隔离,如不能再一个事物写数据的时候另一个事务读数据
根据不同的隔离性,能出现的安全问题有
脏读:一个事务读到了另一个事务未提交的数据。
不可重复读:一个事务范围内多次的对一个数据进行读取,却读到了不同的数据值。
原因:该数据在读取的过程中被另一个事务修改并提交。
虚读(幻读):因两个事务或多个事务的操作,导致产生的结果不符合某事物的要求,(如,事务A更改某数据,事务B又改回来,事务A再次查询发现:我明明改了,为啥没变)
4.持久性
对于已提交的数据,即使系统损坏,或者数据库异常关闭,也不能影响其中的已更改的数据,也就是说,已提交的事物的更新,可以通过备份或者其他方式来找到,而不怕数据的丢失。
/*
* 2017/10/15更
*/
spring 事务管理的三大接口
1.PlatFormTransactionDefinition —— 平台事务管理器
根据Dao层框架不同,可以选择不同的实现类
2.TransactionDefinition —— 事务定义信息
定义事务的隔离级别
定义事务的传播行为
定义事务的超时信息
定义事务是否只读等
3.TransactionStatus —— 事务的具体运行状态
spring事务管理的两种方式
基础配置
1.配置dao层数据源(这里使用dataSourceTransactionManager)
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="" />
<property name="url" value="" />
<property name="username" value="" />
<property name="password" value="" />
</bean>
2.配置平台事务管理器(TransactionManager)
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSouce" ref="dataSource">
</bean>
1.编程式的事务管理
//提供事务模板
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager">
</bean>
2.声明式的事务管理(重要)
1) 基于AspectJ的XML配置方式
<tx:advice id="myAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="outMoney" propagation="REQUIRED" />
</tx:attributes>
</tx:advice> -->
<!-- 配置AOP -->
<!-- <aop:config>
<aop:advisor advice-ref="myAdvice"
pointcut="execution(public * com.ruitaoad.*.outMoney(..))" />
</aop:config>
2)基于AspectJ的注解方式
①开启事务注解
<tx:annotation-driven transaction-manager="transactionManager"/>
②在业务层(业务的java文件)上添加注解@Transactional
————————2017/10/16