声明式事务属性解释
1. read-only=””
4. Propagation=”” 事务传播行为.
5.1 什么样情况下需要考虑事务隔离级别?
当在多线程,高并发访问情况下,需要考虑事务隔离级别.
5.2 考虑事务隔离级别主要考虑的是如何保证数据的安全性.
5.3 脏读?
<!-- 具体哪些方法进行哪些控制 -->
<tx:attributes>
<!-- name:方法名称,可是使用通配符,read-only:只读,是否开启事务 -->
<tx:method name="sel*" read-only="true"/>
<tx:method name="update*" read-only="false"/>
<tx:method name="del*" read-only="false"/>
<tx:method name="insert*" read-only="false"/>
</tx:attributes>
1. read-only=””
1.1 false 默认值,表示需要进行事务开启和提交等,适用于增加,删除,修改
1.2 True 表示只读,不需要开始事务等操作,适用于查询
2. rollback-for=”” 当切点中出现什么类型异常时需要进行回滚.
2.1. 取值为类型全限定名称
2.2 例如: rollback-for=”java.lang.Exception”
3. no-rollback-for=”” 当切点中出现什么类型异常时不需要回滚.
4. Propagation=”” 事务传播行为.
4.1 什么样情况下需要考虑事务传播行为?
当一个有事务控制的方法,调用另一个有事务控制的方法时,出现了2个事务交叉的情况,控制两个事务如何运行的过程就叫做事务传播行为.
4.2 REQUIRED , 默认值.表示如果当前有事务,就在当前事务内执行.如果当前没有事务,新建一个事务.
4.3 SUPPORT: 如果当前有事务就在事务中执行,如果当前没有事务就在非事务状态下执行.
4.4 MANDATORY:如果当前有事务就在事务中执行,如果当前没有事务,抛异常.
4.5 REQUIRES_NEW:一定新建事务,如果当前已经有事务把当前事务挂起.
4.6 NOT_SUPPORTED:必须没有事务,如果当前已经有事务,把当前事务挂起.
4.7 NEVER:必须没有事务,如果当前已经有事务抛异常.
4.8 NESTED:如果当前有事务,新建一个嵌套子事务.
5. isolation=”” 事务隔离级别
5.1 什么样情况下需要考虑事务隔离级别?
当在多线程,高并发访问情况下,需要考虑事务隔离级别.
5.2 考虑事务隔离级别主要考虑的是如何保证数据的安全性.
5.3 脏读?
5.3.1 事务A读取到了事务B未提交的数据.事务A读取到的数据叫做脏数据,读取数据的过程叫做脏读.
5.3.2 在具备缓存的情况下可能出现脏读.
5.4 不可重复读?
5.4.1 针对于表中一行数据或一行中某列数据.
5.4.2 当事务A在修改一行数据时,没有提交,事务B读取到这行数据,事务B读取的数据就是旧数据和以后的真实数据不一致.为了防止事务B读取到未操作完成的数据的过程叫做不可重复读.
5.5 幻读?
5.5.1 针对于整个表.
5.5.2 幻读: 事务A向表中新增一条数据,没有提交事务,事务B查询表中全部数据.事务B读取到的数据和最终真实数据少一条,等读取结束发现读取到的数据和真实数据不一样,好像出现了幻觉一样,所以叫做幻读.
如何解决:isolation=""的取值
5.6 DEFAULT: 默认值. Spring不参与事务控制,事务控制取决于底层数据库.
5.7 READ_UNCOMMITTED:可以读取到未提交数据.可能出现脏读,幻读,不可重复读.这种方式效率是最高的.
5.8 READ_COMMITTED: 只能读取已经提交的数据.可以防止脏读,但是可能出现不可重复读,幻读
5.9 REPEATABLE_READ: 如果有事务对某行数据进行操作,其他事务在读取这行数据时必须等待正在操作的事务执行完毕,才能读取.可以防止脏读,不可重复读.可能出现幻读
5.10 SERIALIZABLE:对整个表进行加锁,只有有事务在操作表,其他事务必须等待排队.全能防止.但是效率是最低的.也是最安全的.