首页 > 编程知识 正文

简述bean的生命周期,springboot怎么实现事务

时间:2023-05-03 19:15:33 阅读:147238 作者:3485

Spring和SpringBoot事务1 .事务摘要2 .事务的四个特性3. Spring事务4. Spring事务隔离级别5 .事务并发问题6. Spring事务隔离级别

1 .事务概览

事务管理是企业开发或多个添加删除操作不可缺少的技术,主要用于保证数据的完整性。 例如,在一个接口上,一次执行a (添加) b (删除) c (更改) )三个操作,执行AB操作后突然发生异常,c不能继续操作,即AB操作不成功,c不成功。 此时,事务管理起到了作用。 保证ABC的三个操作都成功或都不成功。 只有这两个结果。

2 .事务的四个特性事务有四个特性(ACID )

原子性(Atomicity)

原子是指事务中包含的所有操作都成功或全部失败。 成功时启用所有数据库操作,失败时不启用所有数据库操作。

一致性(Consistency)

事务必须将数据库从一个一致性状态转换到另一个一致性状态。 最典型的例子是甲乙每人有100元,不管他们之间怎么转账,总额都要200元。

隔离性(Isolation)

如果多个用户同时访问数据库,则数据库是为每个用户打开的事务。 此外,碧云不能被其他事务的操作干扰。 这意味着,多个并发事务之间必须相互隔离。 常见的锁是解决隔离问题的机制,事务的隔离级别因锁的粒度而异

持久性(Durability)

提交事务后,对数据库中数据的更改将是永久的。 这意味着,即使系统或介质出现故障,也不能丢失已提交事务的更新。

3. Spring事务Spring提供了许多内置事务管理器的实现,而不是直接管理事务。 通常使用的是JpaTransactionManager、DataSourceTransactionManager、HibernateTransactionManager和jdotransactionmager http://www

Spring支持的事务有两类,一是编程式事务(也称编码式事务),二是声明式的事务。

编程事务管理是指将事务管理代码嵌入业务方法中,以控制事务的提交和回退。 (代码中显示的实现类似于我们经常编写的JDBC代码。)

3.1 编程式事务

声明性事务管理是指将事务管理代码与业务方法分离,并以声明的方式实现事务管理。 (使用注释的方法只需要直接向方法中添加@Transactional注释。)

4. Spring事务隔离级别隔离描述级别默认级别默认数据库的默认隔离级别,Oracle (已读) MySQL (可读),其他四个阅读未提交的READ_UNCOMITTED读取未提交的更改。 可能导致脏读、幻读或不可重复读。 这是事务的最低隔离级别。 读取已提交的READ_COMMITED,从已提交的并发事务中读取。 虽然可以防止脏读,但仍然可能发生幻像读和不可重复读。 可重复读取REPEATABLE_READ在事务执行期间锁定事务所引用的所有行。 因此,如果在同一事务中发出相同的SELECT语句两次或多次,则结果数据集始终相同。 不能污读或重复读,但有幻读的风险。 我实地测试表明,MySQL5.6添加事务控件后,不会发生幻读,官方可能已修复,因此无需执着于这一具体情况,下图SERLALIZABLE为一个事务和skdyj事务完全符合ACID原则。 此隔离级别最慢,但不要出现脏读、不可重复读或幻像读。 在实际场景中几乎不能使用

5 .并发事务问题Problem表示脏读Dirty reads事务已被另一个事务修改,但尚未提交。 另外,如果更改后回滚,则第一个事务中检索的数据将无效。 这被称为脏领导。 也就是说,由于读取了无效垃圾数据,因此如果一个被称为脏读不可重复Nonrepeatable read的事务执行同一查询两次或更多次,则第二个事务以查询间隔更新数据,每次获取不同的数据也就是说,经不起一次又一次的考验,被称为不可重复。 读取幻像Phantom read当一个事务第一次读取m个数据,另一个并发事务插入n个数据时。 在重新装入第一个事务时查询了M N个数据。 你面前还有地球,一眨眼就没有了地球,很魔幻,所以叫幻读。 6. Spring事务的传播(Propagation )需要在事务方法中调用另一事务方法,原因是在实际操作中复用代码、减少开发量或某种不得已让我们看看以下七个事务的传播。

解释行为翻译(不允许哦) PROPAGATION_ )

REQUIRED必需的这个是默认的,如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。PROPAGATION_SUPPORTS支持当前事务如果当前有事务,支持当前事务;如果当前没有事务,则以非事务方式执行。PROPAGATION_MANDATORY强制的如果当前有事务,则支持当前事务;如果没有事务,则抛出异常PROPAGATION_REQUIRES_NEW需要新建的如果当前有事务,则挂起当前事务;如果没有事务,则新建一个事务PROPAGATION_NOT_SUPPORTED不支持事务的如果当前有事务,则挂起事务;如果没有事务,则以非事务的方式执行PROPAGATION_NEVER不支持事务(程度更高)如果当前存在事务,则抛出异常;如果不存在事务,则以非事务的方式执行。PROPAGATION_NESTED嵌套的如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则新建一个事务

事务挂起:A,B是带事务的方法(有多个数据库操作),A中调用B,将A挂起,意思是B中出现任何事务异常都和A无关,比如B中出现数据库操作失败,此时A并不会回滚。

7. Spring/SpringBoot注解式事务使用

Spring的事务很简单,一般直接在置于public方法上即可:

7.1 最简单的事务处理: @Transactional public Object transtionalManage() { // db操作1 // db操作2 // db操作3 return "SUCCESS"; } 7.2 限定异常情况的回滚

/**
*发生运行异常时回滚
*/

@Transactional(rollbackFor = { RuntimeException.class }) public Object transtionalManage() { // db操作1 // db操作2 // db操作3 return "SUCCESS"; } 7.3 可能在事务中,包含其他事务的操作时 @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {FileNotFoundException.class,RuntimeException.class}) public Object transtionalManage() { // db操作1 // db操作2 // db操作3 return "SUCCESS"; } 8 注解事务使用的注意事项 事务注解一定不要加在类上,即使Spring支持这么做。事务注解加在方法上时,该方法必须为public不然事务失效。当一个接口中除了有M个查询SQL语句,若再无其他SQL语句,此时没必要加事务注解。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。