一、事务所解决的问题
通俗的讲,事务解决的问题:转账问题
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**: 严格执行串行化(隔离性最高,并发最高,解决了幻读)
版权归原作者 /少司命 所有, 如有侵权,请联系我们删除。