目录
一:声明式事务
1、编程式事务
1.1 由程序员编程事务控制代码。
1.2 OpenSessionInView 编程式事务
2、 声明式事务
2.1 事务控制代码已经由Spring写好。程序员只需要声明出哪些方法需要进行事务控制 和 如何进行控制!
3、 声明式事务都只是针对 ServiceImpl 下的类下的方法(因为Spring只能管理 service 层!)
4、 事务管理器基于通知(Advice)的!
5、 在Spring配置文件中配置声明式事务
<context:property-placeholder location="classpath:db.properties,classpath:second.properties"/> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driver}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean> <bean id="txManager"class="org.springframework.jdbc.datasource.DataSourceTransactionM anager"> <property name="dataSource"ref="dataSource"></property> </bean> <!-- 配置声明式事务 --> <tx:advice id="txAdvice" transaction-manager="txManager" class> <tx:attributes> <!-- 哪些方法需要有事务控制 --> <!-- 方法以 ins 开头事务的管理 --> <tx:method name="ins*" /> <tx:method name="del*" /> <tx:method name="upd*" /> <tx:method name="*" read-only="true" /> <!-- 表示所有的事务都拦截,且只为只读 --> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut expression="excution(* com.bjsxt.service.impl.*.*(..))" id="mypoint"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="mypoint" /> </aop:config>
二:声明式事务中属性解释
1、 name=" " 哪些方法需要被管理,控制。
1.1 支持 * 通配符!
2、read-only="boolean" 是否是只读事务!
2.1 如果为true,告诉数据库此事务为只读事务,数据会优化,会对性能有一定替身,所以只要是查询的方法,建议使用此数据,
2.2 如果为 false(默认值),事务需要提交的事务,建议新增,删除,修改!
3、 propagation 控制事务传播行为。
3.1 当一个具有事务控制的方法被另外一个有事务控制的方法调用后,需要如何管理事务??(新建事务?在事务中执行?把事务挂起?报异常??) 如下!
@Override
public int insert(User users){
return 0;
}
@Override
public int insertUsers(User users){
insert(users);
return 0;
}
3.2 REQUIRED (默认值) : 如果当前有事务,就在事务中执行,如果当前没有事务,就新建一个事务。
3.3 SUPPORTS (随遇而安)如果当前有事务就在事务下执行,如果没有事务。就在非事务状态下执行!
3.4 MANDATORY (傲娇)必须在事务内部执行,如果当前有事务,就在事务内执行,如果没有事务则报错!
3.5 REQUIRES_NEW (横行霸道,必须是自己的事务才执行)必须在事务中执行,如果当前没有事务,新建事务,如果当前有事务,就把当前事务挂起。
3.6 NOT_SUPPORTED (另类独行) 必须在非事务下执行,如果当前有事务就把事务挂起,如果没有就正好!
4、 isolation 事务的隔离级别。
4.1 在多线程或并发的情况下如何保证访问到的数据具有完整性。
4.2 脏读 :
一个事务(A)读到另外一个事务(B)w未提交的数据,另一个事务中数据可能进行了改变,此时事务(A)读取的数据可能和数据库中的不一致,此时认为数据是脏数据,读取脏数据的过程叫脏读!
4.3 不可重复读 :
主要针对的是某行数据(或行中的某列),主要针对的操作是修改操作,两次读取在同一个事务
当事务A读取一次事务后,事务B对事务A读取的数据进行了修改, 事务A 再次读取数据的时候,发现读取的数据和之前读取的数据不一致,这就是不可重复读。
4.4 幻读
主要针对的是新增或者删除,两次事务的结果,
事务A按照特定的条件查询出结果,事务B新增了一条符合条件的数据,事务再次查询时发现 A中查询的数据和数据库中的数据不一致,事务A以为自己出现了幻觉,这种情况称为幻读。
4.5 isolation 的取值:
1. DEFAULT 默认值,由底层数据库自动判断应该使用什么隔离界别!
2. READ_UNCOMMITTED : 可以读取为提交的数据。可能出现脏读,不可重复读,幻读。(效率最高,但是最不安全)。
3. READ_COMMITTED :只能读取其他事务已经提交的数据,可以防止脏读,可能出现不可重复读和幻读。
4. REPEATABLE_READ : 读取的数据被添加锁,防止其他事务修改此数据,可以防止脏读,不可重复读,可能出现幻读。
5. SERIALIZABLE : 排队操作,对整个表添加锁,一个事务在操作数据时,另一个事务得等当前事务操作完成以后才能进行操作,(相当于对整个表得封锁!) 最安全,效率最低!
5、 rollback-for="异常类型全限定路径"
5.1 当出现什么异常时需要进行回滚 ,建议: 手动抛异常时一定给出该属性的值!;
6、no-rollback-for=" "
6.1 : 当出现什么异常时 不会滚事务!
三:Spring 中的常用注解
1、 @Component 创建类的对象,相当于配置 <bean/>
2、 @Service 于@Component 功能相同, 但是是写在 ServiceImpl 类上的.
3、 @Repository 与 @Component 功能相同。 但是是写在数据访问层上的。
4、 @Controller 与 @ Component 功能相同, 但是写在控制器类上。
5、@Resource (不需要写对象的 get/set 方法) jdk提供的注解
5.1 默认按照 byName注入,如果没有对象名称,则按照 byType 注入!
5.2 建议把对象名称和Spring 容器中的对象名相同。
6、Autowired(不需要写对象的 get/set 方法) Spring提供的注解
6.1 默认按照 byType 注入
7、@Value () 获取properties文件中的内容。
@ Pintcut() 定义切点,
@ Aspect() 定义切面类
@Before() 前置通知
@After() 后置通知
@AfterReturning 后置通知,必须切点正确执行
@AfterThrowing 异常通知
@ Arround 环绕通知