事务的四大特征(ACID)
原子性
一致性:事务前后,数据库的完整性约束没有被破坏
隔离性:一个事务的影响在提交前对其他事务不可见
持久性:事务一旦提交,结果是永久性的;即使发生故障,也能够恢复
事务隔离性和原子性
- 事务隔离级别:
1.可串行化
2.可重复读:只允许读取已提交数据,而且一个事务两次读取一个数据项期间,其他事务不得更新该数据
3.已提交读:只允许读取已提交数据,大多数数据库默认隔离级别
4.未提交读:允许读取已提交数据,InnoDB默认隔离级别,并且使用next-key lock避免幻读
均不允许脏写:如果一个数据项已经被一个尚未提交的事务写入,则不允许对数据项执行写操作
隔离性级别的实现:
锁
时间戳
多版本
快照隔离
事务的实现
redo
redo存放在重做日志文件中
每个事务都有LSN(日志序列号)
WAL(预写日志方式):事务提交时,先将日志缓冲写入磁盘,再写数据
undo
undo存放在共享表空间的undo段
事务控制语句
默认事务自动提交(执行SQL语句后)
开始一个事务,需要用BEGIN, START TRANSACTION, SET AUTOCOMIT=0禁用当前会话的自动提交
隐式提交的SQL语句
- 执行完下面的语句,会有一个隐式COMMIT操作:
1.DDL语句,对数据库内部的对象(数据库,表,所有)进行创建、删除、修改等操作
2.修改架构的操作(用户,授权)
3.管理语句
此外,TRUNCATE TABLE不能被回滚
分布式事务
使用分布式事务时,InnoDB的事务隔离级别必须设置为SERIALIABLE
- 组成:
资源管理器(MYSQL数据库)
事务管理器(客户端)
应用程序
- 两段式提交:
第一阶段:参与节点 -> 事务管理器:PREPARE
第二阶段:事务管理器 -> 参与节点:ROLLBACK / COMMIT
如果任何一个节点不能提交,则所有节点都要回滚