事务的属性基本属性

 

ACID:

Atomicity

原子性

对于一个事务来讲,要么一起执行成功要么一起失败

Consistency

一致性

事务结束后系统状态是一致的,即不会是部分成功部分失败

Isolation

隔离性

表示各个事务之间不会互相影响,有四个级别

Durability

持久性

一旦一个事务成功了,那么他的改变是永久性的被记录和操作

 

事务的隔离级别:处理并发事务下的脏读不可重复读幻读等现象

隔离级别

描述

 

default

默认采用后端数据库默认的隔离级别,通常为Read_commited

 

Read_uncommited

读未提交

一个事务可以读取另一个事务修改但还没有提交的数据。

问题:导致脏读,不可重复读,幻读

不建议使用

Read_commited

读提交

一个事务只能读取另一个事务已经提交的数据。

问题:不产生脏读,但有不可重复读,幻读等现象

推荐使用

(数据库默认)

Repeatable_read

可重复读

一个事务在执行过程中,多次重复执行某个查询结果相同,即使有满足条件的新数据产生。

 

Serializable

序列化

所有的事务依次逐个执行,不可能产生干扰

可以防止脏读、不可重复读以及幻读。

严重影响性能

不建议使用

 

事务的传播行为:一个service事务内调用另一个service事务的场景

解决场景:在service层方法A内部,调用另一个service层方法B时,对于方法B的事务如何处理?通常采用的是propagation_required的策略。

传播行为

当前有事务

当前没有事务

propagation_required 常用

加入该事务

创建一个新的事务

propagation_requires_new

挂起原事务,并创建一个新的事务运行

创建一个新的事务运行

propagation_supports

加入该事务

以非事务方式运行

propagation_not_supported

挂起原事务,以非事务方式运行

以非事务方式运行

propagation_never

抛出异常

以非事务方式运行

propagation_mandatory

加入该事务

抛出异常

propagation_nested

创建一个事务作为其嵌套事务运行

创建一个新的事务

 

只读

概述:标记当前事务为只读,可以使数据库对该事务添加特定的优化处理

只读属性不是强制属性,只是一个建议的属性。用来提示数据库驱动程序,当前的事务操作为只读操作,不含有写的操作;此时数据库以及驱动程序可以对该事务添加一些特定的优化,如数据库锁的操作等,可以适当的减轻事务对于数据库的压力(但如果仍执行写的操作是可以执行成功的)。

使用场景:一次查询使用多条sql查询时使用,防止数据的不一致性

如在一次查询中如果使用了多条查询语句,如统计查询,报表查询。在该模型下,多条sql应保证查询的一致性,此时需使用事务支持,以防止数据被其他用户的改变。

使用方法:@Transactional(readOnly=true)
在JDBC中,指定只读事务的办法为:connection.setReadOnly(true);

spring中 注解方式:   @Transactional(readOnly=true)

xml aop配置方式:read-only="true" 

 

事务超时:在特定时间内事务如果没有执行完毕,那么就会自动回滚

即事务的一个定时器。在特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是一直等待其结束,以减轻对于数据库资源的调用。

 

回滚规则:默认回滚规则是

Spring管理事务默认回滚的异常RuntimeException,Error

保证事务的切入点为service层方法,特别是声明式事务以及注解式事务;

Spring事务默认值能回滚RunntimeException,可以修改其默认回滚机制为Exception

声明式事务:<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>

注解事务:@Transactional(rollbackFor=Exception.class)

Service方法中try-catch了异常,需在catch中手动抛出RunntimeException异常

只有非只读事务才能回滚的,只读事务是不会回滚的

 

 

标题

事务五边形的最后一个方面是一组规则,这些规则定义了哪些异常会导致事务回滚而哪些不会。默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚(这一行为与EJB的回滚行为是一致的)

但是你可以声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。同样,你还可以声明事务遇到特定的异常不回滚,即使这些异常是运行期异常。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值