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的回滚行为是一致的)
但是你可以声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。同样,你还可以声明事务遇到特定的异常不回滚,即使这些异常是运行期异常。