一、什么是事物?事务的基本要素(ACID)?
1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
二、事物并发会造成的影响(脏读、不可重复读、幻读)
1、脏读:脏读就是事物A读取了事物B没有提交的内容。
2、不可重复读:在同一个事物内,两次读取的内容不一致(另一个事物对数据的修改)。
3、幻读:在同一个事物内,两次读取的数据条数不一致(另一个事物对数据的新增或删除)。
三、Mysql的事物隔离级别
1、读未提交(read-uncommitted)
会产生:脏读、不可重复读、幻读。
最低的事物隔离级别,一般不用与生产。此事物隔离级别意味着,不同事物之间可读取为提交的事物内容。
例如:
事物A | 事物B |
---|---|
开启事物A | |
开启事物B | |
查询商品数量:100件 | |
修改商品数量:150件 | |
查询商品数量:150件 |
2、读已提交(read-committed)
会产生:不可重复读、幻读。
在一个事物内,多次读取同一条数据,得到的结果不一致。(事物B对数据修改并提交了事物)
事物A | 事物B |
---|---|
开启事物A | |
开启事物B | |
查询商品数量:100件 | |
修改商品数量:150件 | |
查询商品数量:100件 | |
提交事物 | |
查询商品数量:150件 |
3、可重复读(repeatable-read)
会产生:幻读
mysql默认的事物隔离级别:在一个事物内,多次读取同一条数据,得到的结果一致(其他事物对数据的修改,不会影响事物A对数据的读取)。但是对于新增的数据会造成幻读。
可重复读取:
事物A | 事物B |
---|---|
开启事物A | |
开启事物B | |
查询商品数量:100件 | |
修改商品数量:150件 | |
查询商品数量:100件 | |
提交事物 | |
查询商品数量:100件 |
产生幻读:
事物A | 事物B |
---|---|
开启事物A | |
开启事物B | |
查询商品种类(count):10种 | |
新增商品种类(insert):1种 | |
提交事物 | |
查询商品种类(count):11种 |
4、串行化(serializable)
最高的隔离级别:它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。性能最差,可能导致大量的超时现象和锁竞争。