今天小编给大家分享一下Spring中怎么管理事务的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
什么是事务
一个数据库事务是一个被视为一个工作单元的逻辑上的一组操作,这些操作要么全部执行,要么全部不执行。
需要注意的是,并不是所有的数据库(引擎)都支持事务,比如说MySQL的MyISAM存储引擎
事务的四个特性(ACID)
原子性:事务是一个原子性操作,一个事务由一系列操作组成,这一系列操作要么全部执行完成,要么全部不执行
一致性:一个事务执行完成(不管成功还是失败),数据库的完整性不能被破坏(唯一约束,外键约束等)
隔离性:数据库允许多个并发事务同时对数据进行读写操作,隔离性可以防止这些操作同时执行时导致的数据不一致的问题。事务分为不同的隔离级别:读未提交(read uncommitted)、读已提交(read committed)、可重复读(repeatable read)和串行化(Serializable)
持久性:持久性意味着事务完成之后,该事物对数据的更改会永久的保存在数据库中。
Spring对事务的支持
Spring支持编程式事务管理和声明式事务管理两种类型的事务管理。
编程式事务管理比较灵活,但是很难维护,平时用的很少。
声明式事务管理易用性更高,侵入性、耦合度低,更推荐使用。
编程式事务管理
使用TransactionTemplate进行编程式事务管理
@Autowired TransactionTemplate transactionTemplate; public void doTest() { transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { try { // 业务代码 userMapper.deleteById(200106); int i = 10/0; } catch (Exception e) { transactionStatus.setRollbackOnly(); } } }); }
使用PlatformTransactionManager进行编程式事务管理
@Autowired PlatformTransactionManager platformTransactionManager; public void doTest() { TransactionStatus transaction = platformTransactionManager.getTransaction(new DefaultTransactionDefinition()); try{ // 业务代码 userMapper.deleteById(200106); int i = 10/0; platformTransactionManager.commit(transaction); }catch (Exception e){ platformTransactionManager.rollback(transaction); } }
声明式事务管理
Spring主要通过两种方式实现声明式事务管理:
基于注解的声明式事务管理
基于XML的声明式事务管理
基于注解的声明式事务管理
注解的事务管理主要靠@Transactional
注解来实现的。
@Transactional
注解可以作用于类或方法上,作用于类上时,该类的所有public
方法都具有该事物属性
@Transactional
注解只应该被应用到public
修饰的方法上,这是有Spring AOP的本质决定的
@Transactional public void doTest() { userMapper.deleteById(200106); int i = 10/0; }
@Transactional注解
@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface Transactional {// 指定事务管理器@AliasFor("transactionManager")String value() default "";@AliasFor("value")String transactionManager() default "";// 事务的传播行为(enum)Propagation propagation() default Propagation.REQUIRED;// 事务的隔离级别(enum)Isolation isolation() default Isolation.DEFAULT;// 事务超时时间int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;// 读写或只读事务,默认读写事务boolean readOnly() default false;// 导致事务回滚的异常类Class<? extends Throwable>[] rollbackFor() default {};// 导致事务回滚的异常类名 // noRollbackForClassName = {"ArithmeticException"} String[] rollbackForClassName() default {};// 不会导致事务回滚的异常类Class<? extends Throwable>[] noRollbackFor() default {};// 不会导致事务回滚的异常类名String[] noRollbackForClassName() default {};}
Spring事务管理的三个接口
Spring对事务的操作主要通过PlatformTransactionManager
接口,通过这个接口,Spring为各大平台提供了对应的事务管理器,如 JDBC(org.springframework.jdbc.datasource.DataSourceTransactionManager )等。
在Spring框架中,事务管理相关的最重要的三个接口如下:
PlatformTransactionManager
public interface PlatformTransactionManager extends TransactionManager { // 根据指定的传播行为,该方法返回当前活动事务或创建一个新的事务TransactionStatus getTransaction(@Nullable TransactionDefinition definition)throws TransactionException; // 提交指定的事务和关于它的状态void commit(TransactionStatus status) throws TransactionException;// 回滚事务void rollback(TransactionStatus status) throws TransactionException;}
TransactionDefinition
public interface TransactionDefinition { // ………… // 返回传播行为default int getPropagationBehavior() {return PROPAGATION_REQUIRED;} // 返回该事务隔离级别default int getIsolationLevel() {return ISOLATION_DEFAULT;} // 返回超时时间default int getTimeout() {return TIMEOUT_DEFAULT;} // 返回是否只读default boolean isReadOnly() {return false;} // 返回事务名称@Nullabledefault String getName() {return null;}static TransactionDefinition withDefaults() {return StaticTransactionDefinition.INSTANCE;}}
TransactionStatus
public interface TransactionStatus extends TransactionExecution, SavepointManager, Flushable {boolean hasSavepoint();@Overridevoid flush();}
Spring事务属性
Spring事务管理的五大属性:隔离级别、传播行为、超时时间、是否只读、回滚规则
在TransactionDefinition
接口中定义了事务的隔离级别、传播行为、超时时间的常量
public interface TransactionDefinition { // 当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务int PROPAGATION_REQUIRED = 0; // ~,~,~,则继续以非事务的方式运行int PROPAGATION_SUPPORTS = 1; // ~,~,~,则抛出异常int PROPAGATION_MANDATORY = 2; // 创建一个新事务,如果当前存在事务,则把当前事务挂起int PROPAGATION_REQUIRES_NEW = 3; // 以非事务的方式运行,如果当前存在事务,则把当前事务挂起int PROPAGATION_NOT_SUPPORTED = 4; // 以非事务的方式运行,如果当前存在事务,则抛出异常int PROPAGATION_NEVER = 5; // ~,则创建一个事务作为当前事务的嵌套事务来运行,~,则等价于PROPAGATION_REQUIREDint PROPAGATION_NESTED = 6; // 默认的隔离级别int ISOLATION_DEFAULT = -1; // 读未提交int ISOLATION_READ_UNCOMMITTED = 1; // 读已提交int ISOLATION_READ_COMMITTED = 2; // 可重复读int ISOLATION_REPEATABLE_READ = 4; // 序列化读int ISOLATION_SERIALIZABLE = 8; // 默认的超时时间,单位:秒 // 所谓事务超时,就是规定一个事务允许执行的最长时间,如果超过了该时间事务还没有执行完成,则回滚事务。int TIMEOUT_DEFAULT = -1;default int getPropagationBehavior() {return PROPAGATION_REQUIRED;}default int getIsolationLevel() {return ISOLATION_DEFAULT;}default int getTimeout() {return TIMEOUT_DEFAULT;}default boolean isReadOnly() {return false;}@Nullabledefault String getName() {return null;}static TransactionDefinition withDefaults() {return StaticTransactionDefinition.INSTANCE;}}
是否只读:指该事物是只读操作还是读写操作,boolean类型
回滚规则:我们可以人为的控制事务在执行过程中抛出某些异常时仍然提交事务,或者抛出某些异常时回滚事务
以上就是“Spring中怎么管理事务”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。