Java|Spring事务
什么是事务?
事务是逻辑上的一组操作,要么都执行,要么都不执行。
事务的特点?
- 原子性(Atomicity): 一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。
- 一致性(Consistency): 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。
- 隔离性(Isolation): 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- 持久性(Durability): 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
注意:事务是否生效的决定性因素在于数据库引擎是否支持事务。比如,mysql中innodb支持事务,而myisam则不支持事务。
spring事务
spring提供两种事务管理机制:分别为编程式事务
和声明式事务
。
编程式事务
编程式事务需要开发者基于底层api如PlatformTransactionManager
、TransactionTemplate
或者TransactionManager
在代码中手动管理事务的开启、提交和回滚等操作。
基于 TransactionTemplate
1 | public class SimpleService implements Service { |
如果没有返回值,则使用TransactionCallbackWithoutResult
:
1 | transactionTemplate.execute(new TransactionCallbackWithoutResult() { |
事务执行出错时,将回滚操作放在finally
语句块中。
1 | transactionTemplate.execute(new TransactionCallbackWithoutResult() { |
基于 PlatfornTransactionManager 的编程式事务
接口中定义了如下三个方法:
1 | public interface PlatformTransactionManager { |
抽象类AbstractPlatformTransactionManager
实现了PlatformTransactionManager
接口,针对不同的场景,有不同的实现子类实现。
- JpaTransactionManager:如果你用jpa来操作db,那么需要用这个管理器来帮你控制事务。
- DataSourceTransactionManager:如果你用是指定数据源的方式,比如操作数据库用的是:JdbcTemplate、mybatis、ibatis,那么需要用这个管理器来帮你控制事务。
- HibernateTransactionManager:如果你用hibernate来操作db,那么需要用这个管理器来帮你控制事务。
- JtaTransactionManager:如果你用的是java中的jta来操作db,这种通常是分布式事务,此时需要用这种管理器来控制事务。
如下是使用PlatformTransactionManager
保障事务的代码:
1 | DefaultTransactionDefinition def = new DefaultTransactionDefinition(); |
包含这样几个步骤:
- 初始化事务
- 事务配置
- 事务提交
- 事务回滚
声明式事务
比较
使用事务时的注意事项
声明式事务的失效场景
引用
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 mqray's blog!
评论