MySQL的事务与锁


MySQL事物的实现需要依赖数据库提供的锁。

MySQL的事务

MySQL支持MyISAM存储引擎、Memory存储引擎、InnoDB存储引擎,其中只有InnoDB存储引擎支持事务。

事务简介

事务的定义

数据库的事务由一组DML语句组成,即insert、update、delete。通过事务可以保证数据库中数据的完整性,保证这一组DML操作要么全部执行,要么全部不执行。因此,可以把事务看成是一个逻辑工作单元,可以通过提交或回滚操作来结束一个事务。当事务被成功提交给数据库时,事务会保证其中所有操作都成功完成且结果被永久保存在数据库中;如果有部分操作没有成功完成,事务中的所欲操作都需要被执行回滚,数据则回到事务执行前的状态。

事务的特性

Atomicity:原子性。事务中的所有DML操作,要么全部执行成功,要么全部执行失败,不会存在一部分执行成功,一部风执行失败的的情况。事务在执行过程中发生错误,操作的数据会被回滚到事务开始前的状态。

Consistency:一致性。事务在开始执行前后执行结束后,数据库中数据的完整性没有被破坏。

Isolation:隔离性。数据库支持并发操作,允许多个客户端或多个事务同时操作数据库中的数据。隔离性能够防止各事务并发执行时由于交叉执行而导致的数据不一致。

Durability:持久性。当事务成功执行结束后,事务对数据库的修改是永久性的。数据不会因为系统故障而丢失。

控制事务

事务控制语句

通过事务控制语句可以开启一个事务、提交一个事务和回滚一个事务。MySQL同时还提供了保存点的机制,以方便在执行事务发生错误的时候,可以控制事务回滚的位置。

使用事务控制语句
事物的控制语句作用
begin或start transaction二者都是显式开启一个事务
commit或commit work二者都是提交事务,是已对数据库进行的所有修改成为永久性的
rollback或rollback work二者都是回滚事务,并撤销已经修改但未提交的所有操作
savepoint [保存点名称]在事务中创建一个保存点,一个事务中可以有多个保存点
rollback to [保存点名称]回滚事务到指定保存点
releasesavepoint [保存点名称]删除事务中的保存点
set transaction设置事务的隔离级别

事物的并发

数据库允许多个客户端同时访问,当这些客户端并发访问数据库中的同一部分数据时,如果没有采取必要的隔离措施就容易造成并发一致性问题,从而破坏数据的完整性。

MySQL事物的隔离级别
事务的隔离级别脏读不可重复读幻读
读未提交
读已提交×
可重复读××
可序列化读×××
事务的脏读

一个事务读取到了另一个事务还未提交的数据。

事务的不可重复读

指在同一个事务中,前后两次读取的数据结果不一致。

MySQL的锁

MySQL采用锁的机制来解决并发一致性问题,从而保证事务的隔离性。当一个事务在进行操作时会对操作的数据进行加锁,从而限制另一个事务的操作。

InnoDB锁的类型

InnoDB存储引擎支持行级锁和表级锁,默认采用行级锁。

行级锁
  • 共享锁:也叫读锁,同一个数据对象上可以有多把共享锁,如果一个事务在数据对象上加了共享锁,则该事务可以读取数据,但不能修改,其他事务可以在该数据对象上继续添加共享锁。
  • 排它锁:也叫写锁,同一个数据对象上只能有一把排它锁,获取到数据排它锁的事务可以读取和修改数据。

查询语句select默认不会加任何类型锁,因此当数据上有了排他锁,还是可以通过查询语句select获取到数据。

表级锁
  • 意向共享锁(IS):事务在给数据添加行级共享锁之前,必须先取得该表的意向共享锁。
  • 意向排他锁(IX):事务在给数据添加行级排他锁之前,必须先取得该表的意向排他锁。

意向锁是InnoDB存储引擎自维护的,用户无法手动操作。

InnoDB的锁机制

InnoDB的行锁是通过索引实现的,因此只有通过索引查询数据时,InnoDB才会使用行级锁。

MySQL的行级锁是针对索引加的锁,不是针对表中的行加级锁。虽然是访问不同行的记录,但如果表中不存在对应的索引,或者使用了不同的索引,就会造成锁的冲突而锁住整张表。

死锁

死锁是指两个或两个以上的事务在执行过程中,因为互相等待或者因为争夺相同的资源而造成的互相等待的现象。

避免死锁
  • 以固定的方式访问表和行。
  • 大事务拆小。
  • 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概率。
  • 降低隔离级别。
  • 为表添加合理的索引。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值