MySQL事务必知必会

事务必知必会

事务由一组数据操纵语句(DML)组成,这组语句要么全部成功,要么全部失败

事务操作

开启事务

start transaction;

设置保存点

savepoint 保存点名;

回退到某个保存点

rollback to 保存点名;

注:回退到某个保存点时,在这个保存点之后进行的操作全部都会删除
回退到事务开始时状态

rollback;

提交事务

commit;

注:一旦提交事务,所有操作生效,锁释放,前面设置的保存点会全部删除,不能回退。此时其他会话就可以看到变化后的新数据。

事务隔离级别

不考虑隔离会引发的问题:

  • 脏读(dirty read):一个事务看到另一个事务还没提交的数据变化
  • 不可重复读(nonrepeatable read):同一查询操作在一次事务中多次进行,由于其他事务提交的修改和删除操作会让数据变化,此时每次查询到的数据就会不同
    例子:第一次查询余额账户时是100,然后有人往这个账户里转了50并且提交了事务,然后我第二次查询余额是150,与第一次不同。
  • 幻读(phantom read):同一查询操作在一次事务中多次进行,由于其他事务提交的插入操作会让数据变化,此时每次查询到的数据就会不同

注:有的人会觉得其他事务提交后,我的事务能够查询到数据变化是正常的,为什么会不可重复读和幻读呢?但实际上我开启一个事务,就是希望我看到的数据就是我连接数据库时表内的数据,只要我还没提交事务,我能读到数据就不应该产生变化。

隔离级别

隔离级别 脏读 不可重复读 幻读 是否加锁读
读未提交(read uncommitted) 不加
读已提交(read committed) 解决 不加
可重复读(repeatable read) 解决 解决 一般可以解决 不加
可串行化(serializable) 解决 解决 解决 不加

查看当前会话隔离级别

select @@transaction_isolation;

查看系统当前隔离级别

select @@global.transaction_isolation;

设置当前会话隔离级别

set session transaction isolation level 隔离级别;

设置系统隔离级别

set global transaction isolation level 隔离级别;

MySQL默认隔离级别是可重复读

ACID特性

  • 原子性(atomicity):事务不可分割,要么都成功,要么都失败
  • 一致性(consistency):使数据库从一个一致性状态到另一个一致性状态
  • 隔离性(isolation):一个事务不能被其他事务的操作干扰
  • 持久性(durability):事务提交,数据永久性改变

小贴士:MySQL的事务机制需要InnoDB存储引擎才可以使用

posted @ 2022-12-13 22:28  yanhee陈彦熹  阅读(21)  评论(0编辑  收藏  举报