1. 自动提交。
在InnoDB存储引擎中,Mysql默认采用了自动提交模式(AUTOCOMMIT)。如果没有显示的开启一个事务,每一个查询操作都会被当作一个事务执行提交操作。也就是说,每一个查询其实都在一个事务中执行,只是执行查询后,自动会提交事务。
show VARIABLES like 'AUTOCOMMIT';
可以查看自动提交事务的开启状态。1或者on表示开启,0或者off表示禁用。
另外执行一些 DDL 操作,这些操作可能导致大量的数据变动,这些 DDL 操作一般会强制执行COMMIT提交当前的活动事务。
2. 隐式和显式锁。
InnoDB存储引擎中,显示的开启事务,在事务中执行的sql,随时可以被锁定,只有当comimit或者rollback时,这个事务中的锁才能被同时释放。
举个例子:
#事务1
BEGIN;
update my_user set sex = 3 where id = 2;
commit;
#事务2
BEGIN;
update my_user set sex = 10 where id = 2;
commit;
假设事务1执行update后,还未提交,这个时候事务2执行update时就会阻塞,因为执行事务1的update已经被锁定了,只有当事务1 commit或者rollback后,事务2才能继续执行更新操作。
显示加锁的两种方式:
select * from my_user where id = 2 lock in share mode;
select * from my_user where id = 2 for update;
显式加锁后,会阻塞其它事务的修改操作。
如果显式的开启一个事务,那么这个事务中的修改操作也会阻塞其它显式开启事务或者没有显式开启事务的修改操作,直到这个事务的提交或者回滚。
即使没有显示的开启事务,两个修改操作也是互相排斥的,因为每个sql的操作都是在一个事务中进行的,只是它们执行完后会自动的提交事务。
3. show table status
name:表名
Engine:存储引擎
version:版本
Row_format:行的格式。对于MyISAM表,可选的值为Dynamic、Fixed或者Compressed。Dynamic的行长度是可变的,一般包含可变长度的字段,如 varchar 或 blob。Fixed的行长度是固定的,只包含固定长度的列,如 char、integer。Compressed的行则只在压缩表中存在。
rows:表中的行数。InnoDB中是估计值。MyISAM存储引擎是精确的。
Avg_row_length:平均每行包含的字节数。
Data_length:表数据的大小。以字节为单位。
Max_data_length:表数据的最大容量,该值和存储引擎有关。
Index_length:索引的大小,以字节为单位。
Data_free:对于MyISAM表,表示已分配但目前没有使用的空间。这部分空间包括了之前删除的行,以及后续可以被 insert 利用的空间。
Auto_increment:下一个Auto_increment的值。
create_time:表的创建时间。
update_time:表数据的最后修改时间。
check_time:使用check table命令或者myisamchk工具最后一次检查表的时间。
collation:表的默认字符集和字符排序规则。
create_options:创建表时指定的其它选项。
comment:该列包含了一些其它额外的信息。InnoDB和MyISAM表包含的是表的注释。
checksum:如果启用保存的是整个表的实时校验和。
4. redo log 和 undo log
在InnoDB存储引擎中,有两部分组成,即 redo log 和 undo log 。
redo log 用来保证事务的持久性。redo log基本上都是顺序写的,在数据库运行时不需要进行读取操作。redo log 保证事务的原子性和持久性。
undo_log 用来保证事务的回滚和MVCC功能。undo log 是需要进行随机读写的。undo log保证事务的一致性。
持续跟新中.......