事务
事务的属性
事务的基本命令
sql
BEGIN;
START TRANSACTION [READ ONLY|READ WRITE|WITH CONSISTENT SNAPSHOT];
ROLLBACK;
# 手动提交
COMMIT;
# 查看自动提交是否开启
SHOW VARIABLES LIKE 'AUTOCOMMIT';
# 开启自动提交
SET AUTOCOMMIT = 'ON';
# 保存点savepoint
SAVEPOINT [save name];
# 回滚到保存点
ROLLBACK TO SAVEPOINT [save name];
# 删除保存点
RELEASE SAVEPOINT [save name];
redo log(保证持久性)
InnoDB
存储引擎是以页为单位来管理存储空间的,每次都把磁盘的数据读到内存中Buffer Pool
后才能使用,又因为事务需要具备持久性
,如果我们只在内存的Buffer Pool
中修改了页面,假设在事务提交后突然发生了某个故障,导致内存中的数据都失效了,那么这个已经提交了的事务对数据库中所做的更改也就跟着丢失了。所以引入了redo log
,又称为redo 日志
。
将第0号表空间的100号页面的偏移量为1000处的值更新为
2
在事务提交时,把上述内容刷新到磁盘中,即使之后系统崩溃了,重启之后只要按照上述内容所记录的步骤重新更新一下数据页,那么该事务对数据库中所做的修改又可以被恢复出来,也就意味着满足持久性
的要求。上述内容被称为redo 日志
。redo 日志
具有如下优点:
redo
日志占用的空间非常小redo
日志是顺序写入磁盘的
undo log(保证原子性)
在事务的使用过程中因为服务异常或手动调用ROLLBACK
命令时,需要将数据改回原状以保证原子性。而这边为了回滚
而记录的信息叫做undo 日志
。
事务的隔离级别
事务隔离级别 | 脏读 | 不可重复度 | 幻读 |
---|---|---|---|
Read Uncommited(读未提交) | × | × | × |
Read Committed(读已提交 Oracle默认) | √ | × | × |
Repeatable Read(可重复读 MySQL默认) | √ | √ | × |
Serializable(序列化) | √ | √ | √ |
sql
# 查看事务隔离级别
# mysql5.7.20前
SHOW VARIABLES LIKE '%tx_isolation%'
SELECT @@tx_isolation;
# mysql8
SELECT @@transaction_isolation;
# 设置事务隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]