关系型数据库的事务 具有ACID 四个特征:
- 原子性:一个事务的执行,要么全部提交成功,要么全部失败回滚,不能只执行一部分操作。
- 一致性:事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行前后,数据库都必须处于一致性状态。
- 隔离性:当数据库上有多个事务同时执行时,就有可能出现脏读、幻读、不可重复读等问题。为了解决这些问题,就有了隔离级别的概念。注:隔离级别越高,效率越低。
-
- 读未提交 :一个事务还未提交时,它所做的变更可以被其他事务看到。
- 读已提交 :一个事务提交后,它所做的变更可以被其他事务看到。
- 可重复读:一个事务执行过程中 所看到的数据,始终是和事务启动时看到的数据是一致的。
- 串行化:对同一行记录,写加写锁 读会加读锁,当出现读写冲突时。后访问的事务必须等前一个事务执行完成,才能继续执行
-
- 持久性:一旦事务提交,那么它对数据库中对应数据的变更就会永久保存在数据库中,即使系统崩溃或机器宕机,只要数据库能重新启动,那么一定能够将其恢复到事务成功结束的状态
可重复读的实现方式:
在mysql中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到一个以前状态的值。假设一个字段由1依次被改成了2、3、4。字段的当前值是4,
但在查询这条记录时,不同时刻启动的事务会有不同的read-view,不同的视图记录着不同的值。也就是说同一条记录在系统中可以存在多个版本。这就是数据库的多版本并发控制(MVCC)。
因为当系统判定没有事务用到回滚日志时,回滚才会被清理。所有要避免使用长事务,长事务会导致系统里面存在很老的 read-view,由于事务未执行完成,随时可能访问这些数据,所以必须等事务完成之后,才可以清理
这就会导致占用大量的存储空间,其次长事务还占用锁资源,也可能拖垮整个库。