spring事务隔离级别与数据库的不一致怎么办

 我来答
匿名用户
推荐于2016-09-25
展开全部
spring的事务处理主要是依靠AOP实现的,这个没什么好说的随便搜索一下,网上很多示例。

隔离级别是针对并发事务而言的,单个事务的处理很简单不多说。并发事务的处理则比较复杂,因为往往一条数据是跨事务的,这会造成许多不可预知的后果。

一般来说,系统执行并发事务时,会把当前在执行的事务独立起来,也就是和其他事务进行隔离。好像系统中只有这一个事务,其他事务不存在一样。这也就是完全隔离,即系统中只运行单位时间内,最多只有一个事务在执行,其他事务要等到该事务执行完毕之后才能执行,这在现实中基本是不可行的,比如,你要更新你的QQ用户信息,那么就是说,在你更新的这段时间内,其他的用户是无法更新他的用户信息的。

举个深动的例子,把事务比作一条在公路上奔跑的汽车,完全隔离,就像是,在汽车从公路一头到另一头这段时间内,公路上不允许有其他的汽车,这样做当然可以完全避免车祸,也就是数据跨事务带来的隐患风险,但是带来了巨大的效率问题,那么如果同时在公路上让多辆汽车行驶会造成什么情况呢。

具体来说有一下几种:

更新丢失(Lost Update):两个事务都企图去更新一行数据,导致事务抛出异常退出,两个事务的更新都白费了。

脏数据(Dirty Read):如果第二个应用程序使用了第一个应用程序修改过的数据,而这个数据处于未提交状态,这时就会发生脏读。第一个应用程序随后可能会请求回滚被修改的数据,从而导致第二个事务使用的数据被损坏,即所谓的“变脏”。

不可重读(Unrepeatable Read):一个事务两次读同一行数据,可是这两次读到的数据不一样,就叫不可重读。如果一个事务在提交数据之前,另一个事务可以修改和删除这些数据,就会发生不可重读。

幻读(Phantom Read):一个事务执行了两次查询,发现第二次查询结果比第一次查询多出了一行,这可能是因为另一个事务在这两次查询之间插入了新行。

以上就是并行事务处理时常遇到的大致问题。针对这些问题,提出了几个不同的事务隔离级别,适应特定的环境需要。

具体是:

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

读操作已提交(Read Committed):读取未提交的数据是不允许的,它使用临时的共读锁和排写锁实现。这种隔离级别不允许脏读,但不可重读和幻读是允许的。

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

可串行化(Serializable):提供最严格的事务隔离。这个隔离级别不允许事务并行执行,只允许串行执行。这样,脏读、不可重读或幻读都可发生。
匿名用户
2019-11-08
展开全部
不需要一致,兄弟。
spring事务只是封装了一下控制提交、回滚时间点而已,它最多只能说利用了数据库的事务,和数据库事务并不是一个层面上的概念。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lyh8892
2018-06-06
知道答主
回答量:17
采纳率:0%
帮助的人:1.7万
展开全部
我也一直有这样的疑惑,今天特意自己做了下测试,验证的结果:程序会按照spring中设置的事务隔离级别执行。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式