事务的四个性质
1、原子性:事务中的所有操作要么不执行,要么都执行
2、一致性:数据遵循守恒,a向b转了100,事务结束后必定是a少了100,b多了100
3、隔离性多个事务并发执行的化,必定和穿行执行的效果一样
4、持久性:事务在执行结束后,对数据库的影响是永久的
事务并发三个问题
1、脏读:不同事务,一个事务读了另一个事务没有提交的数据
2、不可重复读:多次读取同一个数据的结果不一样。即在连续的俩次读取之间,有一事务对这一数据做了修改并提交了
3、幻读:一事务对表某范围的数据做修改,另一事务对该表做插入,插入的数据刚好符合上一事务的范围,上一事务的用户发现还有没有修改的数据。
事务的四个隔离级别
1、读未提交:读到没有提交的数据。存在脏读,幻读,不可重复读问题
2、读提交:只能读到已经提交的数据。存在不可重复读,幻读问题
3、可重复度:事务开启时就不允许对该数据做修改操作,即给第一个updata操作加行锁。存在幻读问题,因为幻读是对数据删除或者修改。(MySQL默认级别)
4、串行化:一个事务执行完了另一个事务才能执行。解决三个问题,但是效率奇差。
MySQL锁
1、行锁:阻塞一行,对其他行没影响
MVCC对可重复读级别的一点
1.当begin一个事务,第一次查询一个数据,这个数据的值一定是刚刚其他事务提交后的值。也就是说已经开启了一个事务,在没有select的情况下,其他事务修改了A的值并提交,这时执行这个事务第一个select,查询这个A,A的值就是刚刚哪个事务提交的,而不是事务开启时A的值。select后会对A创建了一个快照,紧接着的select会直接找快照中的,而不是数据库的
2.之后再对A updata,updata的对像时数据库中的A,而不是MVCC创建的快照缓存中的A,比如快照中A的值时200,其他事务对A减了50并提交,数据库A的值就是150了,原先的事务在updata A-50,这时就会以数据库的值150,做操作,select一下时100,然后MVCC有创建了一个新的对A的快照版本。(有可能错误,仅供参考)