事务--存在于关系数据库中指访问或更新数据库的程序执行单元

一般指访问并可能更新数据库中各种数据项的一个程序执行单元。

开始事务(begbin transaction)到结束数据(end transaction),遇到异常需要rollback。

事务是数据进行的基本运行单位。程序只是指定事务的隔离级别。

事务四个特性

  • 原子性:指事务在运行后,要么全部成功,要么全部失败回滚;
  • 一致性:指事务运行前后数据从一个一致性状态到另一个一致性状态;
  • 隔离性:事务之间是相互隔离,并发执行的各个事务之间不能互相干扰;
  • 永久性:事务执行后,一旦提交,对数据库中数据的操作是永久性的;

事务如何保证四个特性:

  • 原子性:事务遇到失败回滚的情况,将根据undo.log日志进行回滚;
  • 一致性:一致性是由其他三个特性保证的;
  • 隔离性:

         使用锁:事务在运行过程中,对于读数据加共享锁,对于写数据加写锁,其中共享锁与共享锁不互斥外,共享锁和写锁,写锁和写锁之间是互斥的;

        为解决共享锁和写锁之间的互斥,采用另一种MVVC,即在读取数据时采用快照的方式,这样不会与写锁产生互斥,事务都有自己的transaction_id,事务启动时先获取行数据的rowid,在提交时会判断rowid是否一致再判断是否提交事务。

  • 永久性:redo.log保证当数据库出现问题时可以及时恢复数据;

事务的隔离级别:

  • 读未提交:事务写数据时不允许其他事务写但可以读,导致读到其他事务未提交修改的数据
  • 读已提交(Oracle默认隔离级别):指同一事务中两次读取到的结果不一致,使用行锁可以解决
  • 可重复读(MySql默认隔离级别):指同一事务相同条件下两次读取到的结果不一致,行锁不能控制增加或删除其他行数据
  • 序列化:指本次事务序列化修改完毕之后才允许其他事务进行修改

事务的传播机制

required:若当前存在事务,则加入到事务中,若当前不存在事务,则新建事务;

supports:若当前存在事务,则加入到事务中,若当前不存在事务,则以非事务方式运行;

required_new:若当前存在事务,则嵌套子事务运行,与原事务无关;

not_supports:始终以非事务方式运行;若存在事务,则将事务挂起;

mandatory:强制以事务方式运行:

never:不使用事务,存在事务则抛出异常;

nested:存在事务则新建事务,若原事务回滚,则nested事务一起回滚,但nested事务异常,原事务不回滚

事务的传播机制_浪子北辰的博客-CSDN博客_事务传播机s

spring事务失效场景

1)首先spring使用@transactional注解标注事务,当@transational注解添加到非public方法时会导致事务失效;可通过修改方法为public或使用代理的方式解决;

2)同时,@transaational注解指支持未检查异常(程序运行中会产生的runtimeexception),不支持已检查异常(需要trycatch捕获,不处理不能通过编译),;可以通过rollbackfor属性指定异常类型解决;

3)同时,若标明了需要事务回滚的异常后,需在catch处抛出异常;

4)@transational注解的类不被spring管理;可以通过使用@service或其他可生成bean注解;

5)事务类使用this调用本身方法,spring事务的原理是aop动态代理,当不存在代理对象调用时,事务不会生效;

6)数据源不支持事务同样会导致事务失效;

7)传播类型不支持事务一样会导致事务失效;

Spring事务失效常见场景_啊荻~的博客-CSDN博客_spring事务失效场景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值