spring事务使用示例,简述spring的事务
目录
事务性事务(ACID)Spring支持事务的四个特征是什么?程序化事务管理?基于注释的声明式事务管理?Spring事务管理的三个界面?Spring事务属性
00-1010数据库事务是被视为一个工作单元的一组逻辑操作。这些操作要么全部执行,要么都不执行。
注意不是所有的数据库(引擎)都支持事务,比如MySQL的MyISAM存储引擎。
00-1010原子性:事务是原子操作。一个事务由一系列操作组成,这些操作要么全部执行,要么都不执行。
一致性:事务完成时(无论成功还是失败),数据库的完整性不能被破坏(唯一约束、外键约束等。)
隔离:数据库允许多个并发事务同时读写数据,隔离可以防止这些操作同时执行导致的数据不一致。事务分为不同的隔离级别:未提交读、提交读、可重复读和可序列化。
持久性:持久性意味着在事务完成后,事务所做的数据更改将永久存储在数据库中。
什么是事务
Spring支持编程式事务管理和声明式事务管理。
编程式事务管理很灵活,但是很难维护,很少使用。
声明式事务管理更加用户友好,侵入性和耦合性更低,因此更值得推荐。
00-1010使用TransactionTemplate的程序化事务管理
@ Autowired transaction template transaction template;public void doTest(){ transaction template . execute(new transactioncallbackwithouresult(){ @ override protected void do intra transaction without result(transaction status transaction status){ try {//业务代码user mapper . delete byid(200106);int I=10/0;} catch(Exception e){ transaction status . setrollbackonly();} } });}使用PlatformTransactionManager进行程序化事务管理
@ Autowired PlatformTransactionManager PlatformTransactionManager;public void doTest(){ transaction status transaction=platformtransactionmanager . get transaction(new DefaultTransactionDefinition());Try{ //业务代码user mapper . delete byid(200106);int I=10/0;platformtransactionmanager.commit(事务);} catch(Exception e){ platformtransactionmanager . roll back(transaction);} }
事务的四个特性(ACID)
Spring主要通过两种方式实现声明式事务管理:
基于注释的声明性事务管理
基于XML的声明式事务管理
00-1010标注的事务管理主要通过@Transactional标注来实现。
@Transactional批注可以作用于类或方法。作用于一个类时,该类的所有公共方法都有这个东西的属性。
>@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超详细讲解事务的文章就介绍到这了,更多相关Spring事务内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。