一、事务基本概念
- 在Mysql中只有InnoDB支持事务,支持原子性
- InnoDB引擎默认自动提交事务,也可以设置取消自动提交,如:设置AUTOCOMMIT为0;通过start transaction或begin开启一个事务,然后使用rollback或者commit 结束这个事务。
- 因为InnoDB默认会自动产生事务并提交,所以每次执行一个语句都会commit,严重影响了性能。所以可以用begin开启事务。
1.事务id的分配时机
这里要注意在默认情况下,只有执行修改操作(如INSERT、DELETE、UPDATE语句)才会分配一个事务id,SELECT并不会。
如果通过start transaction使用事务时,并不会马上就分配事务id,也要第一次执行修改操作才会分配,如果开启事务后第一条语句时SELECT,系统会产生如下所示的随机id,等到执行了真正的修改操作时,才会分配一个正式的事务id
trx_id
281479839177256
2.事务id的产生
- 服务器会在内存中维护一个全局变量,每当需要为某个事务分配一个事务id时,就会把该变量的值当作事务id分配给该事务,并且把该变量自增1
- 每当这个变量的值为256的倍数时,就会将该变量的值刷新到系统表空间的页号为5的页面中一个称之为Max Trx ID的属性处,这个属性占用8个字节的存储空间。当系统下一次重新启动时,会将上边提到的Max Trx ID属性加载到内存中,将该值加上256之后赋值给我们前边提到的全局变量
3.事务的四大特征
- Atomicity(原子性):一个事务内的所有所有操作是一个原子,要么全部执行完成,要么全部不执行,不会执行到中间某个步骤。InnoDB的原子性由undo Log来实现,如果发生rollback,就去undo log中找过去的记录来回退。
- Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
- Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。在第二节中将详细的介绍事务的隔离级别。
- Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。