Spring事务的代码承接jdbcTemplate的
文章目录
- 一、事务
- 1.1 注解配置
- 1.2 注解处理事务
- 1.3 xml处理事务配置
- 二、传播方式
- 三、事务的隔离级别
一、事务
不可分割的一系列操作。要么 全执行成功
。要么 如果一个不成功,则全部不成功
。
处理的事务的时候,成功则提交,失败则回滚。
1.1 注解配置
<!-- 1.配置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--开启注解事务(需要添加tx的头文件--><tx:annotation-driven transaction-manager="transactionManager"/>
1.2 注解处理事务
@Transactional(propagation= Propagation.REQUIRED,isolation = Isolation.SERIALIZABLE,rollbackFor = Exception.class)
1.3 xml处理事务配置
利用AOP实现xml处理事务
<!-- 1.配置链接资源 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="url" value="jdbc:mysql:///mybatis"/><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="username" value="root"/><property name="password" value="7895123"/></bean><!-- 2.配置jdbcTemplate --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><!-- 注入链接资源 --><property name="dataSource" ref="dataSource"/></bean><!-- <!– 3.扫描 –>-->
<!-- <context:component-scan base-package="com.zwk"/>--><!-- 1.配置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean>
<!-- <!–开启注解事务–>-->
<!-- <tx:annotation-driven transaction-manager="transactionManager"/>--><!-- 配置通知--><tx:advice id="txAdvice"><tx:attributes><tx:method name="test" propagation="REQUIRED"/></tx:attributes></tx:advice><!-- 配置切入点和切入面--><aop:config><aop:pointcut id="p" expression=" execution(* com.zwk.service.BankService.test(..) )"/><aop:advisor advice-ref="txAdvice" pointcut-ref="p"/></aop:config><bean id="bankService" class="com.zwk.service.BankService"><property name="bankDao" ref="bankDao"/></bean><bean id="bankDao" class="com.zwk.dao.impl.BankDaoImpl"><property name="jdbcTemplate" ref="jdbcTemplate"/></bean>
二、传播方式
- REQUIRED: 如果有事务运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行
- REQUIRES_NEW: 当前的方法必须启动一个新的事物,并在自己的事务内运行,如果有事务运行,应该将它挂起
- SUPPORTS : 如果有事务在运行,当前方法就在这个事务内运行,否则它可以不运行在事务中
- NOT_SUPPORTED: 当前方法不应该运行在事务中,如果有运行的事务,将它挂起
- MANDATORY: 当前方法必须运行在事务内部,如果没有运行的事务,就会抛出异常
- NEVER : 当前方法不应该运行在事务中,如果有运行的事务,就会抛出异常
- NESTED: 如果有事务运行,当前的方法就应该在这个事务的嵌套事务内运行,否则就会启动一个新的事务,并在它自己的事务内运行
三、事务的隔离级别
- 脏读:一个事务可能看到并依赖于其他事务未确认且最终可能被回滚的更改。
- 不可重复读: 在同一个事务内进行多次相同的查询,如果期间其他事务提交了影响这些数据的更改,可能导致“不可重复读”(Non-repeatable Read),即两次相同的查询返回不同的结果。
- 幻读: 同一个事务在两次执行相同的范围查询时,第二次查询可能看到其他事务在此期间提交的新行(这些新行满足第一次查询的条件,但之前未被发现)。
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
Read Uncommitted | 有 | 有 | 有 |
Read Committed | 无 | 有 | 有 |
Repeatable Read | 无 | 无 | 有 |
Serializable | 无 | 无 | 无 |