scope属性和声明式事务
的属性 作用是控制对象有效范围(单例,多例),标签对应的对象默认是单例的,无论获取多少次都是同一个对象
scope可取值
singleton 默认值,单例
prototype 多例,每次获取重新实例化
request 每次请求重新实例化
session 每个会话对象内,对象是单例的
application 在aoolication对象内是单例的
gobal session spring推出的一个对象,依赖于spring-webmvc-portlet,类似于session
声明式事务分为:
编程时事务:由程序员编程事务控制代码 声明式事务:事务控制代码已经由spring写好,程序员只需要声明出哪些方法需要进行事务控制和如何进行事务控制,声明式事务都是针对ServiceImpl类下方法的,事务管理器基于通知(advice)的
声明式事务中属性解释
name=""哪些方法需要有事务控制 支持*通配符 readonly="boolean"是否是只读事务,如果为true,告诉数据库此事务为只读事务,数据库优化,回对性能有一定提升,所以只要是查询的办法,建议使用此数据,如果为false(默认值),事务需要提交的事务,建议新增,删除和修改
propagation 控制事务传播行为:
当一个具有事务控制的方法被另一个有事务控制的方法调用后,需要如何管理事务(新建事务?在事务中执行?把事务挂起?还是报异常?)
REQUIRED(默认值):如果当前有事务,就在事务中执行,如果当前没有事务,新建一个事务
SUPPORTS:如果当前有事务就在事务中执行,如果当前没有事务,就在非事务状态下执行
MANDATORY:必须在事务内部执行,如果当前有事务,就在事务中执行,如果没有事务,就报错
REQUIRES_NEW:必须在事务中执行,如果当前没有事务,新建事务,如果当前有事务,把当前事务挂起
NOT_SUPPORTED:必须在非事务下执行,如果当前没有事务,正常执行,如果当前有事务,把当前事务挂起
NEVER:必须在非事务状态下执行,如果当前没有事务,正常执行,如果当前有事务,报错
NESTED:必须在事务状态下执行,如果没有事务,新建事务,如果当前有事务,创建一个嵌套事务
isolation=""事务隔离级别
在多线程或并发访问下需要保证访问到的数据具有完整性
脏读:一个事务a读取到另一个事务b未提交的数据,另一个事务中数据可能进行了改变,此时a事务读取的数据可能和数据库中的数据是不一致的,此时认为数据是脏数据,这个过程叫做脏读
不可重复读:主要针对的是某行数据(或行中某列),修改操作,当事务a第一次读取事务后,事务b对事物a读取的数据进行修改,事务a中再次读取的数据和之前读取的数据不一致,这个过程叫做不可重复读
幻读:主要针对的操作时新增或者删除,两次事务的结果,事务a按照特定条件查询出结果,事务b新增了一条符合这个条件的数据,事务a中查询的数据和数据库中的数据不一致,事务a好像出现了幻觉,这种情况称为幻读
DEFAULT:默认值,由底层数据库自动判断应该使用什么隔离级别
READ_UNCOMMITED:可以读取未提交数据,可能出现脏读,不可重复读,幻读,但是效率最高
READ_COMMITED:只能读取其它事务已经提交的数据,可以防止脏读,可能出现不可重复读和幻读
REPEATABLE_READ:读取的数据被添加锁,防止其它事务修改此数据,可以防止不可重复读,脏读,可能出现幻读
SERIALIZABLE:排队操作 对整个表添加锁,一个事务在操作数据时,另一个事务等待事务操作完成后才能操作这个表最安全但是效率最低
<!--配置声明式事务-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!--哪些方法需要有事务控制-->
<!--方法以ins开头事务管理-->
<tx:method name="ins*" propagation="" isolation=""/>
<!--<tx:method name="insUsers"/>-->
<tx:method name="del*"/>
<tx:method name="upd*"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>