0


MySQL中的事务

一、事务所解决的问题

通俗的讲,事务解决的问题:转账问题

A向B转账500块钱

A的账户:-500

B的账户:+500

一旦执行第一步之后,第二步出现问题,此时数据就报错了

事务就是把一组操作打包在一起,执行的时候能够保证这些操作之间满足一定的特性,避免刚才的问题

二、事务的特性

    原子性:一个事务是一个不可分割的工作单位,要么全都做了,要么全不做(本质就是通过回滚的方式实现的)

    一致性:数据执行前,数据处于合法状态

    持久性:事务执行完毕之后,数据就被持久修改了(写到磁盘中了)

隔离性:多个事务并发执行时,事务之间不能互相干扰

三、执行并发事务时,产生的问题

1,脏读

如果一个事务A正在修改数据(还没提交),另外一个事务B读取了这里修改的内容,此时B这样的事务的读操作就是脏读,因为事务A在提交数据之前,随时可能修改刚才的数据

解决办法:给写操作加锁

A在修改数据的过程中(提交之前),B尝试读,就会阻塞,一直阻塞到A提交了数据之后,B才能读到数据

引入写加锁,事务的并发程度就降低了,隔离性就提高了

2,不可重复读

一个事务A执行过程中,两次读到的数据不相同,就叫不可重复读

解决办法:读也加锁

读加锁是指A修改数据的时候,B不能读,但B读的时候,A还能写

引入读加锁操作,事务的并发程度就更低了,效率更低了,隔离性就提高了

3,幻读

同一个事务中,两次读到的结果集不一致,虽然读锁加了之后,读的时候不能修改,但可以新增或者删除记录,必须严格的串行化的执行,才能解决幻读问题

四、MySql的隔离级别

对隔离性的要求有多高(隔离性高了,并发程度就低了,数据可靠性高了,效率就低了)

    1,**read uncommitted**:允许读取未提交的数据(隔离程度最低,并发程度最高,会有脏读问题)

    2,**read committed**:只允许读取已经提交的数据,相当于加锁(隔离性提高了一些,并发降低了一些,解决了脏读问题,但是有不可重复读)

    3,**repeatable read**(MySQL的默认隔离级别):给读加锁(隔离性又提高了,并发性又降低了,解决了不可重复读的问题,但有幻读问题)

    4,**serializable**: 严格执行串行化(隔离性最高,并发最高,解决了幻读)

本文转载自: https://blog.csdn.net/qq_50156012/article/details/123230111
版权归原作者 /少司命 所有, 如有侵权,请联系我们删除。

“MySQL中的事务”的评论:

还没有评论