什么是aop方式的事务控制
Spring 框架中提供了一种声明式事务的处理方式,此方式基于 AOP 代理,可以将具体业务逻辑与事务处理进行解耦。也就是让我们的业务代码逻辑不受污染或少量污染,就可以实现事务控制
@Transactional的理解
@Transactional是spring中常用的注解,通常情况下我们在需要对一个service方法添加事务时,加上这个注解,如果发生unchecked exception,就会发生rollback。
注意点:
1.在需要事务管理的地方加@Transactional 注解。@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的public 方法上。
2.@Transactional 注解只能应用到 public 可见度的方法上。如果你在 protected、private 或者package-visible 的方法上使用@Transactional 注解,它也不会报错,但是这个被注解的方法将不会展示已配置的事务设置。
3.Spring团队建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。在接口上使用@Transactional 注解,只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承的,这就意味着如果正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装。
4.@Transactional 的事务开启 ,或者是基于接口的或者是基于类的代理被创建。所以在同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的。
5.了解事务的隔离级别,各个数据库默认的隔离级别是不一样的,在spring中用的是isolation =
Isolation.READ_COMMITTED来设置;了解事务的传播机制,当发生事务嵌套时,按照业务选择对应的传播机制,用propagation= Propagation.REQUIRED来设置。
事务的四个特性:
一:隔离性
在多用户并发访问数据库时,一个用户的事务不能被其他用户的事务干扰到,即多事务之间应该是相互独立的.
二:持久性
事务提交之后,数据库的改变是永久性的
三:原子性
事务包装的一组sql是一个不可分割的工作单位,即事务中的操作是具有统一性的
四:一致性
事务在执行的前后,数据库都必须处于一致性的状态
事务的三个并发问题
脏读:
脏读的定义是:一个事务读取了其他事务未提交的数据,在我们正常开发过程中,是不允许出现的.通常发生在事务在没有隔离性的条件下
不可重复读:
在一个事务内多次读取了表中的数据,且多次读取的结果不同.通常发生事务在update操作中
幻读:
一个事务读取到了别的事务插入或者删除的数据,导致的前后读取记录行数不同,通常发生事务在insert,delete操作中
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。