事务
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
事务原理
1.DOS命令行(客户端)输入mysql用户名密码.
2.MySQL软件校验用户名密码,登录成功为当前用户创建一个临时的日志文件.
3.默认情况下,一条SQL语句就是一个独立的事务,直接将数据同步到磁盘文件.
4.手动开启事务后,相当于告诉数据库,后续所有的SQL操作都先进入临时日志文件.
5.后续的所有操作都先进入日志文件中,在日志文件中,操作的仅仅是过程而不是数据库,如果执行了rollback操作,则直接清空所有日志文件,若执行commit语句,将sql语句批量同步到磁盘上的数据库文件,再清空临时日志文件.
事务日志的用途
事务日志可以帮助提高事务的效率.
事务日志采用的是追加方式,因此写日志的操作是磁盘上一小块区域的顺序IO,而不像随机IO需要磁盘在多个地方移动.所以采用事务日志的方式相对来说要快的多,事务日志持久后,内存中的修改在后台慢慢的刷回磁盘.期间如果系统发生崩溃,存储引擎在重启的时候依靠事务日志自动恢复这部分被修改数据
事务特性
- 原子性:A atomicity
如果一个包含多个步骤的业务操作,被事务管理,那么这些步骤要么同时成功,要么同时失败。 - 一致性:C consistency
数据在事务的执行前后,保证它的完整一致 - 隔离性:I isolation
多个事务之间,相互独立互不干扰 - 持久性:D durability
事务一旦成功提交,同步到数据库磁盘文件,不可逆。
事务的隔离性
多个事务之间是隔离的,相互独立的。但是如果多个事务同时操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
- 脏读:一个事务中,读取到另一个事务未提交的数据
- 不可重复读:一个事务中,两次读取的内容不一致(update)
- 幻读:一个事务中,两次读取的数量不一致(insert、delete)
MySQL数据库隔离级别
级别 | 名字 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | 数据库默认隔离级别 |
---|---|---|---|---|---|---|
1 | 读未提交 | read uncommitted | 是 | 是 | 是 | |
2 | 读已提交 | read committed | 否 | 是 | 是 | Oracle和SQL Server |
3 | 可重复读 | repeatable read | 否 | 否 | 是 | MySQL |
4 | 串行化 | serializable | 否 | 否 | 否 |
数据库性能:1>2>3>4
数据库安全:4>3>2>1
综合考量:2、3
mysql默认的是可重复读,可重复读跟mysql的存储引擎有关系.InnoDB中有一种技术叫MVCC,具体MVCC机制请见:
https://blog.csdn.net/numbbe/article/details/109300087