失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 深入理解Mysql事务ACID特性以及事务隔离级别

深入理解Mysql事务ACID特性以及事务隔离级别

时间:2023-09-14 22:04:41

相关推荐

深入理解Mysql事务ACID特性以及事务隔离级别

事务的概念:

1.事务是一组sql语句的执行,要么全部成功,要么全部失败。保证事务执行的原子性。

2.事务的全部sql语句执行成功,才能提交,将结果写回到磁盘上。

3.事务执行过程中,有的SQL执行失败,那么事务必须回滚到最初的状态。

事务的ACID特性:

事务的原子性(Automic):

事务是一个不可分割的整体,事务必须具有原子性,当修改数据时,要么全部执行,要么都不执行,即不允许事务部分完成。

事务的一致性(Consistency):

一个事务执行前后,数据库数据必须保持一致性状态。数据库的一致性状态必须由用户来负责,由并发控制机制实现。就拿网上购物来说,你只有让商品出库,又让商品进入顾客的购物车才能构成一个完整的事务,商品的数量对于整体并没有发生变化!由于并发操作带来的数据不一致性包括读脏数据(脏读),不可重复读和虚读(幻读)。

事务的隔离性(Isolation):

当两个或者多个事务并发执行时,为了保证数据的安全性,将一个事物内部的操作与其它事务的操作隔离起来,不被其它正在执行的事务所看到,例如对任何一对事务T1和T2,对T1而言,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行。隔离性使得每个事务的更新在它被提交之前,对其它事务都是不可见的

事务的持久性(Durability):

事务完成之后,它对数据库数据的修改,是永久性的。

事务的隔离级别:

事务不经隔离,并发执行事务时,常发生以下问题:

脏读:一个事务读取了另一个事务未提交的数据。

不可重复读:一个事务的操作,导致另一个事务前后读取到不同的数据。

虚读/幻读:

一个事务的操作导致另一个事务前后两次查询的结果数据量不同。例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A新增或者删除了一条满足事务B查询条件的记录,此时事务B再去查询,发现查询到前一次不存在的记录,或者前一次查询的一些记录不见了。(事务B读取了事务A新增加的数据或者读不到事务A删除的数据)

Mysql提供了四种隔离级别:

READ UNCONMITED(未提交读):在READ UNCONMITED级别,事务即使没有提交,对其他事务也是可见的。事务可以读取其他事务未提交的数据,即脏读。

READ CONMITED(提交读):READ CONMITED满足前面对隔离性的简单定义,一个事务开始时,只能看见已经提交的事务所做的修改。换句话说,一个事务从开始时到提交前所做的修改,对其他事务是不可见的。这个级别也叫不可重复读,因为执行两次相同的查询,前后两次可能得到不同的结果。

REPEATABLE READ(可重复读):这个级别保证了同一个事务多次执行相同的查询,得到的结果是一致的。它是Mysql默认的隔离级别

SERIALIZABLE(可串行化):最高的隔离级别。避免了幻读的问题,它是在读取的每一行数据上都加锁,所有性能较低。

JDBC提供了5种隔离级别

除了Mysql提供的四种,还有一个 TRANSACTION_NONE, 表示不支持事务。

需注意:事务隔离级别越高,为避免冲突所花费的性能也就越多。可以通过Connection接口下面的函数来设置事务的隔离级别:

可重复读的实现原理

如果觉得《深入理解Mysql事务ACID特性以及事务隔离级别》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。