- 手动开启(begin)提交(commit)事务和自动开启提交事务(直接写sql就是自动)。
- 事务的四大特征(ACID):原子性(Atomicity)、一致性(Consistent)、隔离性(isolation)、持久性(Durable)。
原子性:一组操作要么都成功,要么都不成功回滚
一致性:多说于业务层面,事务执行前是一致性状态,执行后也是一致性状态,拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
隔离性:多事务操作不能互相干扰
持久性:事务对数据的改变提交是永久的,就算故障也不会丢失提交事务的操作 - 多事务高并发常存在的问题(大到小):脏读、不可重复读、幻读。
脏读:一个事务读取到另一个事务未提交的数据
不可重复读:一个事务读取到另一个事务已经提交的update的结果
幻读:一个事务读取到另一个事务已经提交的insert和delete的结果 - 数据库标准规定四大隔离级别(隔离级别从低到高=并发性从高到低):读未提交(Read uncommitted)、读已提交(Read committed)、可重复读(Repeatable read)、序列化(Serializable)。
不同的数据对这四大隔离级别进行了不同的实现,例如mysql实现了这四种隔离级别,oracle仅实现了2种隔离级别。
读未提交:脏读都没解决,后面更没解决
读已提交:解决了脏读,没解决不可重复读问题和幻读
可重复读:解决了脏读和不可重复读问题,没解决幻读
序列化:脏读、不可重复读、幻读都解决了,但是效率极其低下,一般不用
注意:mysql默认的隔离级别是可重复读,并且mysql的存储引擎innodb在可重复读的实现上解决了幻读,已知通过锁的机制可以解决幻读。 - mysql的2种存储引擎:
(1) MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
(2) InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。 - mysql对于隔离级别的具体实现有2种方式:LBCC(:Lock-Based Concurrency Control基于锁的并发控制)和MVCC(Multi-Version Concurrency Control多版本的并发控制)。
LBCC:利用各种锁
MVCC:利用快照,操作的是当前时间点的一个快照 - 锁又分为行锁和表锁
也可以分为共享锁(Shared Locks),排它锁(Exclusive Locks),意图共享锁(Intention Shared Locks),意图排它锁(Intention Exclusive Locks),记录锁,间隙锁,临键锁
共享锁(S锁):行级锁,读锁,多个事务对于同一数据可以共享一把锁,都能访问到数据但是只能读不能修改。
加锁方式:select * from student where id=1 LOCK IN SHARED MODE;
释放锁方式:commit/rollback
排它锁(X锁):行级锁,写锁,不能与其他锁并存,也就是说不允许其他事务再获取该行的锁,只有该获取了排他锁的事务可以对事务进行读取和修改。
加锁方式:
自动:delete/update/insert 默认加上X锁
手动:select * from student where id=1 for update;
释放锁:commit/rollback
意向锁是由数据引擎自己维护,用户无法手动操作
意图共享锁(IS锁):表级锁,加共享锁之前会默认加上该锁,为了提高效率(为了减少发生锁之间的冲突,需要检索整张表来查看是否有锁,此时有意图锁的存在可以不用检索了,相当于一个标志)
意图排他锁(IX锁):表级锁,加排他锁之前会默认加上该锁,相当于一个标志,提高了加锁效率
下面这三类也可以叫做锁的算法:
记录锁:行锁,仅仅锁住那一行记录
间隙锁:锁住2个存在记录之间的区间,该区间不包含2头,可以解决幻读
临键锁:锁住2个存在记录之间的区间,左开区间右闭区间(相当于记录锁加间隙锁),可以解决幻读
注意:划分的区间并不是根据你的sql语句的条件,而是根据数据库中现有的记录来划分的 - 不存在主键的表(对整张表加锁),存在主键的表(对那个特定的主键加锁),存在唯一键和主键的表(存在主键,主键是一级索引,唯一键是二级索引,假设对二级索引的某条数据加锁,结果是会找到对应的主键索引来加锁)
唯一键可以为null,但是主键不能为空,主键是一类特殊的唯一键
mysql的事务和锁
最新推荐文章于 2022-11-28 23:15:06 发布