spring之旅第六篇-事务管理

一、什么是事务

什么是事务(Transaction)?事务是数据库中的概念,是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。

有个非常经典的转账问题:A向B转款1000元,A转出成功,扣除了A账户的1000元,但当系统准备向B账户增加1000元出现了故障,转入失败,但是A账户的金额已经扣除,这样的结果是A账户凭空少了1000元,很明显这样是不行的,正确的做法应该是当B账户增加成功后,A账户的扣款才能生效。

简单总结一句话就是:事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败

二、事务的四个特性(ACID)

 

原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。

一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。

隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。

持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

三、事务隔离(Isolation Level)

事务隔离意味着对于某一个正在运行的事务来说,好像系统中只有这一个事务,其他并发的事务都不存在一样。大部分情况下,很少使用完全隔离的事务。但不完全隔离的事务会带来如下一些问题。

脏数据(Dirty Read):一个事务读到了另一个事务的未提交的数据

不可重读(Unrepeatable Read):一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致

幻读(Phantom Read):一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致

通过设置事务隔离级别解决这些读的问题,事务隔离级别分别是:

读操作未提交(Read Uncommitted):说明一个事务在提交前,其变化对于其他事务来说是可见的。这样脏读、不可重读和幻读都是允许的。当一个事务已经写入一行数据但未提交,其他事务都不能再写入此行数据;但是,任何事务都可以读任何数据。这个隔离级别使用排写锁实现(脏读,不可重复读,虚读都有可能发生

读操作已提交(Read Committed):它使用临时的共读锁和排写锁实现。这种隔离级别不允许脏读,但不可重读和幻读是允许的(避免脏读。但是不可重复读和虚读有可能发生

可重读(Repeatable Read):说明事务保证能够再次读取相同的数据而不会失败。此隔离级别不允许脏读和不可重读,但幻读会出现(避免脏读和不可重复读.但是虚读有可能发生

可串行化(Serializable):提供最严格的事务隔离。这个隔离级别不允许事务并行执行,只允许串行执行。这样,脏读、不可重读或幻读都可发生(避免以上所有读问题

 

Mysql 默认:可重复读Oracle 默认:读已提交

四、spring事务管理的核心接口

因为在不同平台,操作事务的代码各不相同.spring提供了一个接口: PlatformTransactionManager 接口

spring之旅第六篇-事务管理

 

 

PlatformTransactionManager主要有三个方法

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyxsx.html