11.MySQL事务(必考要点)

MySQL
334
0
0
2022-11-28
标签   MySQL事务

1.事务的概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。

在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

2.事务的特性(ACID)

1)原子性:事务中的若干个操作只有两种结果,全部成功和全部失败(“全部失败”不是指全部步骤都失败了,而是一旦中间某个步骤执行出错,就把前面已经执行完毕的步骤回滚回去)

2)一致性:执行事务前后,事务始终处于合法的状态(例如转账时,减余额账户时,不能减成负的)

3)持久性:事务一旦执行完毕,此时对于数据的修改是持久生效的(写入磁盘了)

4)隔离性:并发执行多个事务,事物之间不能相互干扰 (隔离是为了保证数据的准确,并发是为了提高事务执行的效率; 如果多个事物之间隔离性越强,并发程度就越低,效率就越低 如果多个事物之间隔离性越弱,并发程度就越高,效率就越高)

并发执行事务时,产生的问题 1.脏读: 如果一个事务正在准备修改数据,还没提交呢,另外一个事务读取了这里即将被修改的内容

*****解决脏读的办法:给写操作加上锁(也就是写的时候不允许另外一个事务读,如果读就会阻塞,也就是写的时候不能读,读的时候可以写,不能等同于synchronized)

引入写加锁,并发程度低了,效率低了,隔离性就提高了

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

*****解决方案:读和写都要加锁(也就是读的时候不能写,写的时候不能读)

再引入读加锁,并发程度更低了,效率更低了,隔离性就又提高了

3.幻读: 在读的时候,虽然在指定类中加了锁,但是其他的类是可以修改的,也就会导致最后读到的结果集不一样(同一事物中,两次读到的结果集不一样)

*****解决方案:必须严格的串行化执行

MySQL隔离级别 1.read uncommitted:允许读取未提交的数据(隔离程度最低,并发性最高,会有脏读的问题) 2.read committed:只允许读取已经提交的数据,相当于写加锁(隔离性提高了一些,并发性降低了一些,解决了脏读,但是会有不可重读的问题) 3.repeatable read(MySQL的默认隔离级别):给读也加锁(隔离性有提高了,并发性有降低了,解决了不可重复读,但是会有幻读的问题) 4.serializable:严格串行化执行(隔离性最高,并发最低,解决了幻读的问题)

3.事务的使用

(1)开启事务:start transaction; (2)执行多条SQL语句 (3)回滚或提交:rollback/commit; 说明:rollback即是全部失败,commit即是全部成功。
start transaction;
-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';
commit;