MVC开发中,service层统称为业务层,在service的每个方法中,负责调用不同的dao层组件完成常规的CRUD操作,在不加事务的情况下,就会出现各种乱象,违背了事务特性,因此,事务在MVC开发中所占的角色重要性不言而喻。
所谓事务,可以从它的特性特性分析,它有以下四个重要特性: 这几个特性是任何健壮的MVC应用都应该具备的
原子性
一致性
隔离型
持久性
以下用生活中购物的例子作为阐述事务特性的比喻,重点在于体现事务在整个业务逻辑生命周期中所扮演的角色,用以帮助理解相关细节:
原子性是一个独立的不可再分的操作单元,执行该业务逻辑要么全部成功,要么全部失败,现实生活中你去购买东西,就是一个完整的业务逻辑,该业务逻辑涉及到你付钱给收银员,收银员将你所购买的东西交给你,如果在你付钱这个步骤出现失败,那么整个业务逻辑都应该被回滚,而不应该出现在你付钱失败的情况下,收银员将你所购的东西交给你,这样就不合常理,也就是违背了购物逻辑所应具备的原子性;
一致性可以从上述的例子中体现出来,在购物这个事务未执行以前,你所要付的款项在你自己手里,而你所要购买的东西在收银员手里,在购物事务发生之后,东西在你手里,而款项在收银员手里,等价交换,前后拥有一致性;
隔离性体现在由于是多线程,每个现成中发生的业务逻辑和其它现成都是独立的,不会出现数据共享或者暴露相关细节,如你购买东西,不可能让别人帮你付钱,你付了钱,收银员不可能把东西交给别人,这就是事务特性中的隔离性;
持久性,持久性是指在该购物逻辑发生之后,相关的数据记录会被持久保存下来,收银员通过收银系统将物品售出及所收款项录入营业系统,该次业务逻辑的相关细节被持久保存一下以备日后统计之用;
以上只是通过购物这个环节形象说明事务所具备的四个特征,用以帮助理解;
并发访问下的问题列举:
脏读
不可重复读
幻读
第一类丢失更新
第二类丢失更新
分析产生以上问题的原因:
由于计算机的处理器采用分时多任务处理,每个线程的业务逻辑操作按照时间来轮训,具有不确定性,因此导致了以下问题的发生
1、脏读:当事务读取还未提交的数据的时候,就会发生这种事件,举例来说:事务1修改了一行数据,然后事务2在事务1还未提交修改操作之前读取了被修改的行,假如事务1进行了回滚操作,那么事务2读取的数据就属于脏数据,该数据只是事务1过程中的一个临时值,最终是不存在的。
2、不可重复读:当事务2次读取同一行数据的时候,得到的结果不一样,举例来说,事务1读取了一行数据,然后事务2修改或者删除改行并提交修改操作,当事务1重新读取该行的时候,就会读到和第一次数据不一致的版本,或者发现该数据已经不存在(在事务2删除提交之后)的现象称为不可重复读。
3、幻读:事务1基于一定的条件搜索了某张表,事务2插入并提交了基于该条件的一条记录,当事务1再次读取的时候,就会发现多了或者少了某些数据,该现象称为幻读,如同做梦一般;
4、第一类丢失更新:对于同一个账户,假设有1000元,事务1进行提取操作,事务2进行转行操作,事务1开始事务,读取账户快照为1000元,事务2同样读取快照为1000元,事务1成功提取200元,修改并提交最终记录为800元,事务2由于操作失败回滚,此时的回滚将会将该账户记录回滚到事务2开始的地方,也就是该账户会重新被回滚到1000元,覆盖了事务1的提取修改。
5、第二类丢失更新:是不可重复读的一种特例,事务1和事务2同时取款,事务1取款后提交,事务2再次查询的时候发现账户少了事务1所取的款项,此时事务2不知道应该以那个为标准,是以第一次查询为标准还是最后一次查询,假如不重复读取,事务2则会覆盖掉事务1的提交;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。