【理论】事务精讲

来源:互联网 发布:淘宝怎么免单 编辑:程序博客网 时间:2024/05/19 09:51
事务的介绍:
事务:一组具有明确边界的执行过程,例如张三给李四赚钱
事务技术:是企业应用开发中不可缺少的一门技术;
事务目的:就是用来确保操作数据的完整性与一致性;

通常在WEB项目中,如果讲事务,那么事务就是一个请求,因为一个请求就正对一个执行过程;
按照类型来分,事务可以分为:逻辑事务(业务事务,为了保证业务逻辑的统一成功)和物理事务(数据库事务,为了保证数据的准确性);逻辑事务包含物理事务;

事务具有4个特性;ACID
1、原子性:事务是一个整体,是密不可分的,具有原子的特性,那么都成功,要嘛都失败;
2、一致性:事务一旦开启,处理事务的这整个过程,数据满足(质量守恒),讲究数据的准确性;
3、隔离性:事务与事务之间,是互补干扰的,相互之间不影响,目的是为了防止数据被破坏;加锁
4、持久性:事务一旦提交,他的结果就应该具有持久性,不应该再次被同一事务进行破坏,而应该持久化到数据库中;

事务的隔离:要求事务必须在它处理完了之后其他事务才能处理相同的数据;开发过程中严格的遵循事务的隔离性,虽然保证了数据的准确性,但牺牲了整个项目的效率; 但是在实际开发中,要在数据准确性(空间)和反应性能(时间)上综合的权衡,“时空转换”;严格遵循隔离性不可取;
获得性能上准确性的问题如何解决
隔离原则的级别
1、可串行化(serializable):事务的最高隔离级别,绝对可以保证数据的准确性,其他隔离在不同程度上允许数据的不一致;实现原理接近于对数据加锁;
2、可重复读(Repeatable Read):使用最广泛的一种; 隔离级别仅次于上面的可串行化,但是它有一个问题,它会造成数据幻读问题,给操作者造成一种不应该有的幻觉;操作大量数据才会出现 幻读就是当前事务不是独立执行的时候发生(两个事务需要同时对一张数据进行修改;);
例如:A操作将所有员工工资从3k增加到5K;然后返回所有人员信息;
B在这个批量删改和返回之间修改了其中一条的为2K,A就会读取到幻觉的数据;
3、读已提交(Read Committed):隔离级别仅次于可重复读,会造成不可重复读;不可重复度:是指数据库访问过程中,同一个事务范围内两次查询的结果不一致
例如:在一个事务中,多次读取同一数据,在这个事务还没有结束的时候,
另外一个事务访问了这个数据,并做了修改;那第一个事务再次读取的数据就不一样了,这样对于数据库而言,不可重复读远比幻读来的容易,我们在工作中使用更多的是可重复读;
4、读未提交(Read Uncommitted):隔离级别最低的,开发中勿用,会造成脏读,事务在处理的时候,可以读取其它事务尚未提交的数据,来做开发; 脏读也叫无效数据读取,在系统中根据无效数据做出的操作是不是正确的;
总 结:如何保证数据准确性,以及如何保证系统灵活性,需要综合权衡;

事务的传播:当有多个同时具有事务控制能力的Service的实现类方法互调的时候所形成的事务边界控制问题;在Spring框架中常见的事务边界控制(传播特性)有以下7中:
1、REQUERED:支持当前事务,如果当前没有事务,就新建一个事务----最为常见(CUD增删改的时候;) a()----b() a有事务就按a的事务,没有则新建一个a的事务,按照a的事务走;
2、SUPPORTS:支持当前事务,如果没有事务,就按照非事务方式执行,通常在查询的时候使用最为广泛
3、MANDATORY:支持前事务,如果没有事务,就抛出异常;
4、REQUERED-NEW:无论有没有事务,都新建一个新的事务,并且按照新的事务来执行,并将老事务挂起
5、NOT-SUPPORTS:以非事务执行,如果有事务就将事务挂起;
6、NEVER:绝对不能在事务范围内执行,如果有事务就将事务挂起,只有该方法没有关联到任何事务,才能正常执行;
7、NESTED:如果调用者与被调用者都含有事务,就将被调用者的事务包含在调用者的事务中,如果没有跟REQUERED的处理方式一样;

在Spring框架中处理事务的方式有两种:
一、编程式事务,将事务控制的代码嵌入到业务逻辑的方法中去管理事务的提交与回滚;通常在编程式事务中,必须在每一个业务操作的方法中都包含有额外的事务管理代码;
二、声明式事务,在企业应用开发中最为常见;将事务管理申明在配置文件中,采用AOP面向切面的思想动态管理业务层的事务,它将事务管理提到切面中,将事务代码从核心业务中分离出来,让程序员只需要关注于核心业务

0 0
原创粉丝点击