-
2312查看全部
-
开启注解事务查看全部
-
还不错查看全部
-
好的查看全部
-
Spring事务管理的课程目标:
我们会学习到如下内容:
1.事务的回顾,在事务的回顾里边,我们会回顾一下事务的基本的概念以及事务的一些相关的特性,
2.那么接下来我们会学习spring事务管理中的一组API,因为我们可以通过这组API来进行spring的事务管理
3.那么接下来我们就来学习spring中的编程式的事务管理,以及spring中的声明式的事务管理。
那么这就是我们这节课的一个目标。
那么我们在说完了这节课的课程目标之后呢我们接下来来说一下,我们的第一个内容,就是事务的知识点的回顾。
什么是事务?以及事务的特性?
事务指的是逻辑上的一组操作,这组操作呢,要么全部成功,要么全部 失败。那么我们在这里以一个银行转账的案例来分析,
那么我们假设有两个人,一个是张三,一个是李四,那么张三账户里有2千元,李四账户也有2千元,那现在张三要给李四进行转账1千元的操作,那么我们就会修改张三的账户,给张三的账户扣除掉1千元,然后我们要修改李四的账户,给李四的账户加1千元,那这样的话,我们就完成了一个转账的操作。但这组操作呢,它不应该出现的情况就是张三转了1千元之后,比如说突然间断电了,或者出现了一些其他的特殊情况,那么这样的话,张三的钱转出去了,而李四没收到,那这种情况是不应该出现的,所以说在这种情况里边,我们的一组操作我们可以用一组事务来进行管理,那么这组操作一旦加入到了事务的管理操作里边了,那么它们就必须一起成功,或者一起失败,那么一起 成功的情况是什么呢 就是张三把钱转出去了,李四也收到钱了,那如果是一起失败呢,那一起失败指的是张三的钱也没转出去,李四也没收到钱,这种情况不允许出现张三钱转了,李四没收到的情况。所以说这是事物的概念。它就是用来保证我们这组操作要么全都成功,要么全都失败,那么在事务当中呢,它是有一些相关的特性的,那事务一般都会有4大特性:这4大特性包含了原子性,一致性,隔离性,以及持久性,那什么是原子性呢,原子性指的是事务是一个不可分割的单位,事务中的操作要么都发生了,要么都不发生,那么我们都知道,物理中原子是最小的单位 ,那么它强调的是我们这一组单位是不能进行分割的,不能拿出来单独去运行的,因为单独运行的话,那都有可能会导致错误或者而失败的产生,那么我们要把这一组呢要放在一个事务里边,那么它们就能一起成功或者一起失败了。那什么是事务的一致性呢?那事务的一致性指的是,我们事务执行的前后,数据的完整性,要保持一致,也就是说我们在事务执行之前,张三里边有2千元,李四账户里也有2千元,那么总共是4千元,那当我们转账完成之后,那张三的账户里是1千元,而李四的账户里是3千元,那总共的金额也是4千元,所以说在执行的前后,我们的这种完整性,是一致的。它不能出现张三的钱被扣掉,李四没收到这种情况。那什么是隔离性呢?隔离性强调的是,多个用户并发访问数据库的时候,那么一个用户的事务的执行过程当中,不应该受到其他事务的干扰,比如说我们有两个事务在同时的操作数据库,那你这边比如说正在修改张三的记录,而又有一个记录进来修改张三这条记录,那最后修改完事之后呢,会导致你这个记录会被重复的修改,或者是一开始的事务改完的记录被第二个事务给覆盖掉了。那么我们的事务在执行的过程当中呢,尽量不要让它收到其他事务的干扰,那这怎么做到呢?那数据库里都有一个事务的隔离级别,我们可以通过设置隔离级别呢,来解决这种问题。还有一个就是事务的持久性,事物的持久性它指的是一个事务一旦被提交了,那它的记录就被真正的修改到我们的数据库里边了。如果你的事务没有提交,那你在执行了一个语句之后呢,这个数据还没有被真正的修改到数据库,或者是进入到数据库,那么只有你的事务提交了之后,这条记录才会被真正的修改或者进入到我们的数据库当中,那这个就是事务的持久性。通过以上的讲解,可以对事务有一个简单的认识。
查看全部 -
PlatformTransactionManager接口介绍:
通过Spring的API可以知道该接口有许多实现类例如:DataSourceTransactionManager、HibernateTransactionManager等。Spring会为不同的持久化框架提供了不同PlatformTransactionManager接口实现。
比如当我们使用SpringJDBC或者iBatis进行持久化数据时使用DataSourceTransactionManager。
通常我们使用的是DataSourceTransactionManager和HibernateTransactionManager。
查看全部 -
事务隔离级别(四种)
mysql默认采用REPEATABLE_READ隔离级别;
oracle默认采用READ_COMMITTED隔离级别
查看全部 -
spring开发基础包
查看全部 -
事务的特性:
原子性 -> 指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性 -> 指事务前后的数据的完整性必须保持一致。
隔离性 -> 指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要互相隔离。
持久性 -> 指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,即使数据库发生故障也不应该对其有任何影响。
查看全部 -
spring事务管理主要有三个接口
platformTransactionManager
平台事务管理器:事务的提交,事务的回滚等
TransactionDefinition
事务定义信息 隔离,传播,超时,只读。
TransactionStatus 事务具体的运行状态
查看全部 -
课程总结:介绍了四种Spring做事务控制的方法
手动编写代码做事务管理(很少使用)
为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强(很少使用)
基于AspectJ的XML方式(经常使用), 一旦配置好之后,类上不需要添加任何东西
12345678910111213141516171819202122232425262728 <!-- 配置事务管理器 -->
<
bean
id
=
"transactionManager"
class
=
"org.springframework.jdbc.datasource.DataSourceTransactionManager"
>
<
property
name
=
"dataSource"
ref
=
"dataSource"
></
property
>
</
bean
>
<!-- 配置事务的通知(事务的增强) -->
<
tx:advice
id
=
"txAdvice"
transaction-manager
=
"transactionManager"
>
<
tx:attributes
>
<!--
propagation 事务传播行为
isolation : 事务的隔离级别
read-only 只读
rollback-for 发生哪些异常回滚
no-rollback-for 发生哪些异常不回滚
timeout 过期信息
-->
<
tx:method
name
=
"transfer"
propagation
=
"REQUIRED"
isolation
=
"DEFAULT"
read-only
=
"false"
rollback-for
=
""
timeout
=
""
no-rollback-for
=
""
/>
</
tx:attributes
>
</
tx:advice
>
<!-- 配置切面 -->
<
aop:config
>
<!-- 配置切入点 -->
<
aop:pointcut
expression
=
"execution(* cn.muke.spring.demo3.AccountService+.*(..))"
id
=
"pointcut1"
/>
<!-- 配置切面 -->
<
aop:advisor
advice-ref
=
"txAdvice"
pointcut-ref
=
"pointcut1"
/>
</
aop:config
>
4. 基于注解的方式(经常使用)
配置文件中开启注解驱动
1234567 <!-- 配置事务管理器 -->
<
bean
id
=
"transactionManager"
class
=
"org.springframework.jdbc.datasource.DataSourceTransactionManager"
>
<
property
name
=
"dataSource"
ref
=
"dataSource"
></
property
>
</
bean
>
<!-- 开启注解事务 -->
<
tx:annotation-driven
transaction-manager
=
"transactionManager"
/>
代码中直接使用@Transactional注解
12345678910 /**
* @Transactional 注解中的属性
* propagation 事务的传播行为
* isolation 事务的隔离级别
*
*/
@Transactional
(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,readOnly=
false
)
public
class
AccountServiceImpl
implements
AccountService{
//其他省略
}
查看全部 -
课程总结:介绍了四种Spring做事务控制的方法
手动编写代码做事务管理(很少使用)
为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强(很少使用)
基于AspectJ的XML方式(经常使用), 一旦配置好之后,类上不需要添加任何东西
<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置事务的通知(事务的增强) --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- propagation 事务传播行为 isolation : 事务的隔离级别 read-only 只读 rollback-for 发生哪些异常回滚 no-rollback-for 发生哪些异常不回滚 timeout 过期信息 --> <tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT" read-only="false" rollback-for="" timeout="" no-rollback-for=""/> </tx:attributes> </tx:advice> <!-- 配置切面 --> <aop:config> <!-- 配置切入点 --> <aop:pointcut expression="execution(* cn.muke.spring.demo3.AccountService+.*(..))" id="pointcut1"/> <!-- 配置切面 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/> </aop:config>
4. 基于注解的方式(经常使用)
配置文件中开启注解驱动
<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 开启注解事务 --> <tx:annotation-driven transaction-manager="transactionManager"/>
代码中直接使用@Transactional注解
/** * @Transactional 注解中的属性 * propagation 事务的传播行为 * isolation 事务的隔离级别 * */ @Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,readOnly=false) public class AccountServiceImpl implements AccountService{ //其他省略 }
查看全部 -
如果不考虑隔离性,会引发如下的安全问题: 1.脏读。 一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的。 2.不可重复读。 在同一个事务中,多次读取同一数据返回的结果有所不同。 3.幻读。 一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录。查看全部
-
propagation_required:a存在事务,则b与a同一事务,如果a没有事务,则b新起事务 propagation_supported:a存在事务,则b与a同事务,如果a没有事务,则b也没有事务 propagation_mondatary:a存在事务,则b与a同事务,如果a没有事务,则抛异常 propagation_required_new:如果a存在事务,b新起事务 propagation_not_supported:如果a存在事务,b不已事务运行 propagation_never:如果出现事务,直接抛出异常 propagation_nested:a事务运行结束后,会有保存点,这边可以自定事务,b出错,a可以回滚或者就到a的保存点查看全部
-
事物管理 1.编程式的事物管理 在实际应用中很少使用 通过TransactionTemplate手动管理事务 2.使用xml配置声明式事务 开发中推荐使用(代码侵入性最小) spring的声明式事务是通过aop实现的查看全部
举报