spring事务的传播行为与隔离级别
2015-08-13 16:05
537 查看
在实际开发过程中,特别是在并发高、更新数据量大、关系表比较多的情况下,经常会遇到关于事务的问题。
首先,要了解的是什么是数据库的隔离级别。在一个典型的应用中,并发是不可避免的,多个事务并发运行,操作同一个数据来完成任务。并发可能会导致以下问题:
脏读(Dirty read):
脏读发生在一个事务读取了被另一个事务改写但还未提交的数据时。如果这些改变在稍后被回滚,那么之前的事务读取的到数据就是无效的。
不可重复读(Nonrepeatable read):
不可重复读发生在一个事务执行相同的查询两次或两次以上,但每一次的查询结果不同时。这通常是由于另一个并发的事务在两次查询之间更新了数据。
幻读(Phantom read):
幻读是一个事务读取几行记录后,另一个事务插入了一些记录,幻读就发生了。在后来的查询中第一个事务就会发现有一些原来没有的额外的记录。
spring的事务隔离级别
ISOLATION_DEFAULT:
使用数据库默认的隔离级别。
ISOLATION_READ_UNCOMMITTED:
允许读取改变了的还未提交的数据,可能导致脏读、不可重复读和幻读。
ISOLATION_READ COMMITTED:
允许并发事务提交之后读取,可以避免脏读,可能导致重复读和幻读。
ISOLATION_REPEATABLE_READ:
对相同字段的多次读取结果一致,可导致幻读。
ISOLATION_SERIALIZABLE:
完全服从ACID的原则,确保不发生脏读、不可重复读和幻读。
可以根据自己的系统对数据的要求采取适应的隔离级别,因为隔离牵涉到锁定数据库中的记录,对数据正性要求越严格,并发的性能也越差。
spring的事务传播行为
spring事务的传播行为说的是当一个方法调用另一个方法时,事务该如何操作。
PROPAGATION_MANDATORY:
该方法必须运行在一个事务中。如果当前事务不存在则抛出异常。
PROPAGATION_NESTED:
如果当前存在一个事务,则该方法运行在一个嵌套的事务中。被嵌套的事务可以从当前事务中单独的提交和回滚。如果当前不存在事务,则开始一个新的事务。各厂商对这种传播行为的支持参差不齐,使用时需注意。
PROPAGATION_NEVER:
当前方法不应该运行在一个事务中。如果当前存在一个事务,则抛出异常。
PROPAGATION_NOT_SUPPORTED:
当前方法不应该运行在一个事务中。如果一个事务正在运行,它将在该方法的运行期间挂起。
PROPAGATION_REQUIRED:
该方法必须运行在一个事务中。如果一个事务正在运行,该方法将运行在这个事务中。否则,就开始一个新的事务。
PROPAGATION_REQUIRES_NEW:
该方法必须运行在自己的事务中。它将启动一个新的事务。如果一个现有的事务正在运行,将在这个方法的运行期间挂起。
PROPAGATION_SUPPORTS:
当前方法不需要事务处理环境,但如果一个事务已经在运行的话,这个方法也可以在这个事务里运行。
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
<tx:method name="get*" read-only="true"/>
tx:attributes>
tx:advice>
<aop:config>
<aop:pointcut expression="execution (* com.yourcompany.services.impl.*.*(..))" id="services"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="services"/>
aop:config>
首先,要了解的是什么是数据库的隔离级别。在一个典型的应用中,并发是不可避免的,多个事务并发运行,操作同一个数据来完成任务。并发可能会导致以下问题:
脏读(Dirty read):
脏读发生在一个事务读取了被另一个事务改写但还未提交的数据时。如果这些改变在稍后被回滚,那么之前的事务读取的到数据就是无效的。
不可重复读(Nonrepeatable read):
不可重复读发生在一个事务执行相同的查询两次或两次以上,但每一次的查询结果不同时。这通常是由于另一个并发的事务在两次查询之间更新了数据。
幻读(Phantom read):
幻读是一个事务读取几行记录后,另一个事务插入了一些记录,幻读就发生了。在后来的查询中第一个事务就会发现有一些原来没有的额外的记录。
spring的事务隔离级别
ISOLATION_DEFAULT:
使用数据库默认的隔离级别。
ISOLATION_READ_UNCOMMITTED:
允许读取改变了的还未提交的数据,可能导致脏读、不可重复读和幻读。
ISOLATION_READ COMMITTED:
允许并发事务提交之后读取,可以避免脏读,可能导致重复读和幻读。
ISOLATION_REPEATABLE_READ:
对相同字段的多次读取结果一致,可导致幻读。
ISOLATION_SERIALIZABLE:
完全服从ACID的原则,确保不发生脏读、不可重复读和幻读。
可以根据自己的系统对数据的要求采取适应的隔离级别,因为隔离牵涉到锁定数据库中的记录,对数据正性要求越严格,并发的性能也越差。
spring的事务传播行为
spring事务的传播行为说的是当一个方法调用另一个方法时,事务该如何操作。
PROPAGATION_MANDATORY:
该方法必须运行在一个事务中。如果当前事务不存在则抛出异常。
PROPAGATION_NESTED:
如果当前存在一个事务,则该方法运行在一个嵌套的事务中。被嵌套的事务可以从当前事务中单独的提交和回滚。如果当前不存在事务,则开始一个新的事务。各厂商对这种传播行为的支持参差不齐,使用时需注意。
PROPAGATION_NEVER:
当前方法不应该运行在一个事务中。如果当前存在一个事务,则抛出异常。
PROPAGATION_NOT_SUPPORTED:
当前方法不应该运行在一个事务中。如果一个事务正在运行,它将在该方法的运行期间挂起。
PROPAGATION_REQUIRED:
该方法必须运行在一个事务中。如果一个事务正在运行,该方法将运行在这个事务中。否则,就开始一个新的事务。
PROPAGATION_REQUIRES_NEW:
该方法必须运行在自己的事务中。它将启动一个新的事务。如果一个现有的事务正在运行,将在这个方法的运行期间挂起。
PROPAGATION_SUPPORTS:
当前方法不需要事务处理环境,但如果一个事务已经在运行的话,这个方法也可以在这个事务里运行。
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
<tx:method name="get*" read-only="true"/>
tx:attributes>
tx:advice>
<aop:config>
<aop:pointcut expression="execution (* com.yourcompany.services.impl.*.*(..))" id="services"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="services"/>
aop:config>
相关文章推荐
- 在Eclipse下,出现“找不到或无法加载主类 ”的问题的解决方式
- spring注解详解
- 搭建JavaWeb项目资料整理
- (荐)跟我学SpringMVC目录汇总贴、PDF下载、源码下载
- java使用默认浏览器打开一个网页
- 用ant实现java项目的自动构建和部署
- Java IO 技术之基本流类
- 懒得笔记3 spring bean 的生存范围 生命周期
- Java 中 finally 语句块的深度辨析
- eclipse pydev 跳转
- java入门--4111:判断游戏胜者-Who Is the Winner
- Spring MVC 简介
- 《JDK 8学习笔记》读书笔记(1)
- SpringMVC接收页面表单参数
- spring整合hibernate配置文件
- Java中String问题汇总
- Java基础针对自己薄弱环节总结05(API、集合)
- java设计模式----代理模式
- SpringMVC拦截器(资源和权限管理)
- Java初学--无限循环