我是靠谱客的博主 精明小蝴蝶,最近开发中收集的这篇文章主要介绍数据库 - 事物隔离级别和Spring事物传播特性,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.关于事物

1.事务是程序中一系列严密的操作,所有一系列操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,要么全执行,要么全不执行。
2.事务特性有分为四个:原子性、一致性、隔离性、持续性。

	原子性:事务是数据库逻辑工作单元,事务中包含的操作要么都执行成功,要么都执行失败。
	一致性:事务执行的结果必须是使数据库数据从一个一致性状态变到另外一种一致性状态。
			这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这是数据库就处于不一致状态。
	隔离性:一个事务的执行过程中不能影响到其他事务的执行,即一个事务内部的操作及使用的数据对其他事务是隔离的,
			并发执行各个事务之间无不干扰。
	持续性:即一个事务执一旦提交,它对数据库数据的改变是永久性的。之后的其它操作不应该对其执行结果有任何影响。

2.事物的隔离级别

1.数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。四种隔离级别用来解决事物并发操作中可能会出现脏读,不可重复读,幻读,丢失更新1,丢失更新2等问题。

2.事物并发中可能出现的问题:

	脏读:指当一个事务正字访问数据,并且对数据进行了修改,而这种数据还没有提交到数据库中,这时,另外一个事务
			也访问这个数据,然后使用了这个数据。因为这个数据还没有提交那么另外一个事务读取到的这个数据我们称之为脏数据。
			依据脏数据所做的操作肯能是不正确的。
	不可重复读:指在一个事务内,多次读同一数据。在这个事务还没有执行结束,另外一个事务也访问该同一数据,
			那么在第一个事务中的两次读取数据之间,由于第二个事务的修改第一个事务两次读到的数据可能是不一样的,
			这样就发生了在一个事物内两次连续读到的数据是不一样的,这种情况被称为是不可重复读。
	幻读:一个事务先后读取一个范围的记录,但两次读取的纪录数不同,我们称之为幻象读
		(两次执行同一条 select 语句会出现不同的结果,第二次读会增加一数据行,并没有说这两次执行是在同一个事务中)
	丢失更新1:A,B读取数据并更新,A回退造成B的更新丢失。
	丢失更新2:A不回退造成B的更新丢失。

3.四种隔离级别

  • read uncommited(读未提交):是最低的事务隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。可防止丢失更新。
    实现原理:读数据时候不加锁,写数据时候加行级共享锁,提交时释放锁(防止丢失更新)。

  • read commited(读已提交):保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。可以防止脏读问题。
    实现原理:事务读取数据(读到数据的时候)加行级共享锁,读完释放;事务写数据时候(写操作发生的瞬间)加行级排他锁,事务结束释放。

  • repeatable read(重复读):这种事务隔离级别可以防止脏读,不可重复读,也可解决幻读问题.
    实现原理:通过MVCC保证读取一致,解决不可重复读;通过next-key保证其他事物update、insert操作,解决幻读。

  • serializable(序列化):这是花费最高代价但最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读之外,还避免了幻象读。
    实现原理:在读操作时,加表级共享锁,事务结束时释放;写操作时候,加表级排他锁,事务结束时释放
    这里写图片描述

Mysql数据库默认的隔离级别是repeatable read

4.spring事务传播特性:

事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。spring支持7种事务传播行为:

1.propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
2.propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
3.propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
4.propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
5.propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6.propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
7.propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作

最后

以上就是精明小蝴蝶为你收集整理的数据库 - 事物隔离级别和Spring事物传播特性的全部内容,希望文章能够帮你解决数据库 - 事物隔离级别和Spring事物传播特性所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部