什么是事务
在数据库中会经常涉及到事务问题,事务可以理解为是一组操作的集合,这一组操作是一个整体,要么全部成功,要么全部回滚只有这两种情况。
如何开启、提交、回滚事务
在MySQL中一般通过 (begin/start transaction)关键字开启事务,然后对数据进行操作(执行SQL语句),使用 commit 关键字提交事务,即将操作的结果保存到数据库,使用 rollback 关键字回滚事务,就是撤销操作回到事务还未开始前的状态。
事务由四大特性(ACID):
- 原子性(Atomicity):原子性是事务最小的执行单位,不允许再次分割。事务操作要么全部成功,要么全部回滚。
- 一致性(Consistency):一致性就是事务执行前后的数据要保持一直,比如转账方和收款方转账前后金钱的总额是不变的。
- 隔离性(Isolation):隔离性就是不同的事务之间是相互隔离的,每个事务之间不会产生影响。
- 持久性(Durability):持久性就是事务被提交之后对数据库中数据的操作是永久性的。即便系统出现故障也不会丢失。
并发事务带来的问题
- 脏读:一个事务读取到了另一个事务还没有提交的数据。从而导致读取到的数据不一致,可能是不准备或者是根本不存在的数据。
- 不可重复读:一个事务在多次查找同一个数据的时候,由于其他事务对这个数据进行插入、修改或删除操作,每次读取到的数据都是不一样的。
- 幻读:一个事务在根据同一个条件查找数据时,由于其他事务进行插入、修改或删除操作,每一次查找到的结果都是不相同的。
- 丢失修改:两个或者多个事务同时修改一个数据,只会有最后的一个事务会修改成功,其他事务修改的结果会被覆盖。
解决并发事务问题的方案——事务隔离级别
- 读未提交:最低的隔离级别,事务允许读取到其他事务还未提交的数据,可能出现脏读、不可重复读、幻读问题。
- 读已提交:允许读取到其他事务已经提交的数据,可以有效避免脏读,但是会出现幻读和不可重复读的问题。
- 可重复读:对同一数据多次读取的结果是相同的,除非是事务本身修改数据,可以有效避免脏读和不可重复读问题,但是依然存在幻读问题。
- 串行化:最高的隔离级别,所有事务必须按照顺序执行,可以有效地避免脏读、幻读和不可重读的问题。但是性能低。
事务的隔离级别越严格,数据库的效率就会越低,MySQL默认隔离级别是可重复读。Oracle默认隔离级别是读已提交。