Transaction
MySQL 事务机制,手动管理事务机制,手动管理事务机制的隔离性
Last updated
MySQL 事务机制,手动管理事务机制,手动管理事务机制的隔离性
Last updated
用一句话说,事务机制就是 要么不做,要么做完的机制,MySQL 就支持这种机制
MySQL的事务机制运行如下图所示:
SQL 语句并不是直接对数据库进行操作, 而是将数据库里的数据先复制到 undo 日志当中, 在undo日志里面进行修改。随后若确定保存更改,则将undo日志里面的修改记录提交到redo日志当中,交由redo日志对数据库进行数据操作。若不确定不修改数据,则undo日志将原来的数据返回到数据库当中。
假设这么一个场景, 有多条SQL语句需要执行,执行到一半的时候,机房停电。随后恢复供电,问题来了?我们此时并不知道执行到了第几条SQL语句, 不知道数据库里面哪些数据被修改了,这是非常严重的后果。
事务机制就能规避这种风险,我们先把需要修改的记录保存到redo日志中,交由redo日志去处理,假设在提交过程停电也没有关系,因为所有的修改记录已经在redo日志中了,redo日志重新对数据进行同步即可。
默认情况下,MySQL 对每一句SQL 语句都使用了事务机制。但实际情况中,我们需要确保一次性执行完成多条SQL语句。这时候就需要手动管理事务机制了。
MySQL 手动管理事务机制非常简单, 只需要把SQL语句包裹在 START TRANSACTION - COMMIT (表示提交修改) 或者 START TRANSACTION - ROLLBACK (表示数据回滚) 即可。
原子性,要么做完,要么不做
一致性,不管有多么的高并发,执行结果一定正确
隔离性,事务不受其他事务的影响
持久性,事务一旦提交,结果就不可改变,即使遇到死机,停电,也可以通过日志完成对数据的修改
事务有四种隔离级别,分别是
READ UNCOMMITED, 可以读取未提交的数据
READ COMMITED, 可以读取已提交的数据
REPEATABLE READ, 可以重复读取数据
SERIALIZABLE, 序列化执行事务,也就是事务一个一个执行,不支持并发
在SQL 中设置事务隔离级别也非常简单,只需要在 手动开启事务之前运行一句SQL语句即可。随后整个会话(也就是在当前SQL文件中),事务的隔离级别都是如此。