Skip to content

事务

事务的属性

事务的基本命令

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]