Mybatis的事务管理
1、事务的概念
在我们开发过程中,几乎每个业务逻辑都离不开对数据库的操作。那么对数据的的单个操作(单个CRUD)或者多个操作(多个CRUD)绑定在一起,就称为事务。
单个事务是一个最小的逻辑执行单元,整个事务不能分开执行,要么同时成功,要么同时失败。(PS:初次接触事务概念的朋友,也许会难以理解最小逻辑执行单元,反正当初我是误解了,误解的地方还真有点描述不出来,原谅我词穷,下面举个例子领悟吧)。
场景一:
在我们的service层(业务逻辑层)要执行一个转账操作(A账户转账到B账户,转100元)。那么简单的做法就应该是A的账户执行一个update操作减去100,然后B的账户也执行一个update操作增加100。这两个操作绑定到一起,就称为事务。这个事务是不能分开执行的,要么同时成功(转账成功),要么同时失败(转账失败)。不能A账户少了100,B账户没增加100,那这100归我(哈哈)?这样就破坏了数据的完整性了。
场景二:
将一批数据插入到数据库中,如果要求同时成功或者同时失败,当然是不可靠的,假如每次在执行过程中程序都出现意外呢(^_^),那么就需要将每次插入(insert操作)作为一个事务(这也说明,多个事务是可以同时存在的,这也是容易误解的地方)。(反例:当然,我们将所有的insert操作绑定在一起也是一个事务,那么就要求,要么全部失败,要么全部成功,是不能分开执行的)。
这两个场景在我们的业务逻辑层具体怎么实现,体现的就是事务的传播行为(后面我们单独开一篇来讲事务)。
通常来讲,事务具备4个特性,就是经常听人提起的(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。具体说明见下表:
特性 | 说明 |
原子性(Atomicity) | 也就是说事务是应用中的最小逻辑执行单元,就像自然界中的原子一样,不能再被拆分,也就是再次强调,单个事务是不能够分开执行的(哪怕你单个事务中包含了n多个CRUD,都是要么全部成功,要么全部失败)。 |
一致性(Consistency) | 事务的执行结果,必须使数据库从一种一致性状态变成另一种一致性状态。就比如上面的场景一,A、B之间不管转账几次,A、B的账户总额一定是不变的,A、B的账户和总额之间的关系始终是一致的。如果A减少100,B没增加,那么它们之间的一致性就被破坏了。因此,一致性是通过原子性保证的。 |
隔离性(Isolation) | 各个事务之间的执行是互不干扰的,比如上面的场景二,单个事务的insert插入,并不不能影响下一个事务的insert操作成功与否,再比如我和你同时访问优快云(文章评论的业务逻辑肯定只有一个),我对一篇文章的评论能否提交成功,并不能影响你对一篇文章的评论能否提交成功。所以,事务也是并发的。 |
持久性(Durability) | 我们单个事务一旦提交,那么对数据所做的操作都是永远保存在数据库中的,直到下一个事务再对其进行更改 |
那么,在我们去实现事务的过程中,就应该包含以下几个操作:创建(create)、提交(commit)、回滚(rollback)、关闭(close)。
回到我们上面的场景一就是:创建一个事务分别包含A和B的update操作,如果两个update操作都成功了,则commit,如果在两个update执行过程中,断网或者断电了,再或者B被匪徒劫持了导致A取消转账,则rollback,最后close事务。
2、Mybatis的事务管理
在Mybatis中,事务的管理分为两种形式:
>使用JDBC的事务管理机制: 就是在没使用ORM框架之前,基于jdbc中