Spring数据库隔离级别及性能分析

这里,以MySQL为例,说明以下问题:

首先,如果一般项目不配置交易本身,一般默认是自动提交,这是自动提交操作的执行和事务提交后。

(注:交易绑定到数据库操作,即当一个程序执行(statement.excute等操作)数据库的水平,交易开始发生。
当然,Spring可以将多个数据库操作绑定到事务中,因此我们需要引入Spring事务配置方法。以下是常用的方法。还有许多其他的方法。
Spring提供了大量的事务配置策略,非常方便和简洁:

复制代码代码如下所示:


propagation_required
propagation_required
propagation_required
propagation_required,只读
propagation_required,只读



一般的Spring业务配置都是上面的分配方法,具体的互联网参数不了解自己的搜索条的意思,那么你需要注意以下几点:(一)
1。我习惯于在服务配置和交易,需要注意的是,只有服务,开始与保存、更新,等等,可以配置是有效的。如果在服务的方法的名称是不是一开始就保存,如tasksave(),即使在服务更新的方法是在实现类中调用,配置交易也是无效的。我试过了。
这个属性的2.readonly是非常有趣的,因为使用后,它会自动增加数据库的隔离级别为一级,从提交的重复,我稍后会解释。

两。数据库的隔离级别

数据库有四种主要的隔离级别:不提交阅读、提交阅读、重复阅读和序列化阅读(以下理解是不可见的)。
1。isolation_read_uncommitted:这是最低的隔离级别允许外部事务看到事务未提交的数据。
此隔离级别产生脏读,而不是重复阅读和错觉。
2。isolation_read_committed:确保数据由一个事务修改之前被另一个事务读取另一个事务提交,无法读取事务未提交的数据
三.isolation_repeatable_read:这个事务隔离级别可以防止脏读和不可重复读取,但有可能是幻觉。
除了保证一个事务不能读取另一个事务未提交的数据,这也保证了下列条件是可以避免的(不可重复读)。
4。isolation_serializable这是成本最高但最可靠的事务隔离级别,以执行交易处理。
除了防止脏的阅读,它不能重复阅读,而且也避免了阅读的错觉。
MySQL的默认隔离级别是反复的读,就是isolation_repeatable_read。

注:未提交读和序列化的阅读是不常用的,未提交读太危险,很多脏数据会读,读是可序列化的成本性能锁定数据和成本每行读取,所以很少使用。大多数数据库的隔离级别是提交读,如Oracle,SQL Server,MySQL的默认隔离级别是可重复的数据。

接下来,我将结合项目分析来调整数据库隔离级别的性能。
本地MySQL数据库是从isolation_repeatable_read水平降低到isolation_read_committed水平。

场景:没有Spring,用户A在一个事务中向数据库发送两个查询,用户B在两个查询之间更改数据库记录。

结果:isolation_repeatable_read级别:用户一个查询的结果是不同的。

isolation_read_committed水平:结果是用户的两个查询相同因为记录上的锁操作。


以任务模块为例,比较了本地运行页面上的两种事务处理方法,得到如下结果。(在每个统计数据之前,我们清理浏览器缓存并得到平均3倍)。

结果发现,对于某些特殊的逻辑操作,数据库事务的隔离级别降低了,性能也得到了提高。
但如果查询过程不涉及对数据库复杂的逻辑操作和查询结果集的逻辑同一时代同一交易交易次数,提高速度的影响不明显,即交易的数据集时,锁定的时间是可以忽略的,然后理解事务隔离级别和锁的关系。

当谈到数据库隔离级别时,您必须说出锁的概念。

它主要分为共享锁和互斥锁。
共享锁:读取表操作加上锁和锁后,其他用户只能获得表或行的共享锁,不能获得独占锁,也就是说只能读取或写入。

互斥锁:由写表操作添加的锁。锁定后,其他用户无法获得表或行的任何锁,通常在MySQL事务中。

个人理解:共享锁和互斥锁之间没有严格的边界。我认为它应该由结果决定,不管它是一个共享锁还是一个互斥锁。

例如,用户A修改一块数据,用户B修改数据并挂起。但是B查看这些数据来证明用户已经添加了行级共享锁。

例如,用户A修改了一块数据,用户B无法查询数据,而其他数据也失败了,因此它肯定有一个表级独占锁。

另一个例子是:用户A修改数据,用户B查询记录可以,但是修改这个记录不好,修改其他记录也不好,然后增加表级共享锁。

不同的数据隔离级别,锁是不同的。

回到前面的问题,一旦ReadOnly属性设置,数据库级如果提交读,然后同样的交易,如果查询结果集的两个时间间隔,修改数据库,那么它应该是相同的结果集,当等效查询用于重复的隔离级别。