spring初学day04

听说坚持一件事后果很严重,鄙人不信邪,表示要试试。😃 此博文仅为学习笔记,每天记录。防止错误观念传播,萌新谨慎观看 :)

spring第一天内容
spring第二天内容
spring第三天内容

事务

spring事务控制
			1、什么是事务
			  事务是指一组sql语句的集合,这些sql语句的执行是一致的,作为一个整体执行。
			2、什么时候会使用事务
			  当一个操作,涉及多个表,需要保证这些语句都成功才能完成我的功能
			3、JDBC、mybatis访问数据库怎么处理事务    
			  JDBC中先获取connection连接、之后connection.commit()、connection.rollback().
			  mybatis中sqlsession.commit()、sqlsession.rollback()
			4、JDBC与mybatis处理事务的方式有何不同
			  了解不同数据库访问计数使用事务的原理,处理事务的多种方法。
			5、怎么处理以上处理事务方面的不足
			  spring提供统一的事务处理模型,抽象了事务处理各个方面,定义了事务的处理步骤。声明式事务,把事务相关的资源和内容提供给spring,spring可以处理。
			6、处理事务,需要做什么、怎么做。
			  spring处理事务模型、使用的步骤都是固定的,把事务使用的信息提供给spring,事务内部提交、回滚,使用事务管理器对象。事务管理器是一个接口和实现类。
使用方式

XML配置文件

<!-- 开启AOP注解扫描 -->
    <aop:aspectj-autoproxy proxy-target-class="true" />

    <!-- 事务管理器,依赖于数据源 -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
 <!-- 编写通知:对事务进行增强(通知),需要编写对切入点和具体执行事务细节 -->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <!--
                为切入点方法添加事务详情
                name:方法名,*表示任意方法名称
                propagation:设置传播行为
                isolation:设置隔离级别
                read-only:是否只读
            -->
            <tx:method name="add*" propagation="REQUIRED" isolation="DEFAULT" read-only="false" rollback-for="Exception" />
            <tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT" read-only="false" rollback-for="Exception" />
            <tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT" read-only="false" rollback-for="Exception" />
        </tx:attributes>
    </tx:advice>

事务的隔离级别:

	1、DEFAULT 
	默认隔离级别,每种数据库支持的事务隔离级别不一样,如果Spring配置事务时将isolation设置为这个值的话,那么将使用底层数据库的默认事务隔离级别。顺便说一句,如果使用的MySQL,可以使用"select @@tx_isolation"来查看默认的事务隔离级别
	2、READ_UNCOMMIT
	读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种,因此很少使用
	3、REA_COMMIT
	读已提交,即能够读到那些已经提交的数据,自然能够防止脏读,但是无法限制不可重复读和幻读
	4、REPEATABLE_READ
	重复读取,即在数据读出来之后加锁,类似"select * from XXX for update",明确数据读取出来就是为了更新用的,所以要加一把锁,防止别人修改它。REPEATABLE_READ的意思也类似,读取了一条数据,这个事务不结束,别的事务就不可以改这条记录,这样就解决了脏读、不可重复读的问题,但是幻读的问题还是无法解决
	5、SERLALIZABLE
	串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了

事务的传播行为

	1、REQUIRED
	支持当前事务,假设当前没有事务。就新建一个事务
	2、SUPPORTS
	支持当前事务,假设当前没有事务,就以非事务方式运行
	3、REQUIRES_NEW	
	新建事务,假设当前存在事务。把当前事务挂起
	--一下为不是很主要的---------------------------------------------------
	4、MANDATORY
	支持当前事务,假设当前没有事务,就抛出异常
	5、NOT_SUPPORTED
	以非事务方式运行操作。假设当前存在事务,就把当前事务挂起
	6、NEVER
	以非事务方式运行,假设当前存在事务,则抛出异常
	7、NESTED
	如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
@Transactional注解
	放在public方法上,表示当前方法具有事务
	属性:
            propagation:设置传播行为
            isolation:设置隔离级别
            read-only:是否只读
            timeout:超时时间
            rollback-for:回滚异常类
大型项目使用事务的方式
	小型项目直接使用@Transactional注解即可
	1、aspect J配置文件
	2、加入aspectJ依赖
	3、声明事务管理对象
	4、声明方法需要的事务类型
	5、配置aop,制定哪些类需要创建代理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值