1. 什么是事务?
事务其实就是一组DML(insert、delete、update) 语句的集合,MySQL数据库 Innodb 存储引擎支持事务、MyISAM不支持。而且MySQL的事务默认是自提交式模式,如果想要开启事务,必须以begin命令开始,以commit或者rollback命令结束。
1.1 事务的特性
- 原子性:主要依靠undo.log日志实现,即在事务失败时执行回滚。undo.log日志会记录事务执行的sql,当事务需要回滚时,通过反向补偿回滚数据库状态
- 持久性:主要依靠redo.log日志实现。首先,mysql持久化通过缓存来提高效率,即在select时先查缓存,再查磁盘;在update时先更新缓冲,再更新磁盘。以减少磁盘io次数,提高效率。但由于缓存断电就没了,所以需要redo.log日志。在执行修改操作时,sql会先写入到redo.log日志,再写入缓存中。这样即使断电,也能保证数据不丢失,达到持久性
- 隔离性:我的理解就是多线程时多事务之间互相产生了影响,要避免这个影响,那就加锁。mysql的锁有表锁,行锁,间隙锁,好像还有一个锁数据库的,叫全局锁还是什么来着。
- 写写操作:通过加锁实现隔离性
- 写读操作:通过MVCC实现隔离性
- 一致性:就是事务再执行的前和后数据库的状态都是正常的,表现为没有违反数据完整性,参照完整性和用户自定义完整性等等。而上面三种特性就是为了保证数据库的有一致性
在事务的四大特性中,我们主要研究隔离性,重点就是事务的隔离级别。
2. 事务的实现
原文链接:MySQL事务