事物与数据库锁的关系(锁只是数据库事物一方面)
1.事物:
首先是一组DB执行的最小逻辑单元,是一组sql语句。要么全部执行,要么全部执行失败回滚。
首先是一组DB执行的最小逻辑单元,是一组sql语句。
首先是一组DB执行的最小逻辑单元,是一组sql语句。
2.事物有四种特性,acid,
原子性:意味着数据库最小的逻辑执行单元
隔离性:多线程执行同一数据库记录时,彼此无感知。事务不会查看到中间状态的数据。
一致性:记录与索引的一致性
持久性:数据落地了,就不会丢了。哪怕数据库dow掉,依然数据可以恢复。
3.事物的4种特性分别依靠什么来实现和保证的呢?
:1).事务隔离性:是通过数据库的锁来保证的。通过锁住行,锁住表,来让并发的其他事物无法操控当前事物操控的记录。从而避免了其他事物造成的脏读,不可重复度,幻读。
(隔离性实现原理是通过数据库锁让其他事物无法操控当前记录,对当前的记录全部锁住,从而保证当前操控数据的干净性)
2).原子性,一致性,持久性:是通过数据库日志来保证的。对数据库的每次操作,日志都会有记录。回滚更是这个原理。
事物的回滚就是通过数据库binlog来实现的。
3)所以,事物是数据库提供的一套完整的数据库操作组合,满足业务的需要。利用了数据库的很多特性,包括不同的数据库锁,及日志。而隔离性通过数据库锁机制,知识事务的一个方面而已。
事物是数据库提供的一套完整的数据库操作组合,满足业务的需要。利用了数据库的很多特性,包括不同的数据库锁,及日志
事物是数据库提供的一套完整的数据库操作组合,满足业务的需要。利用了数据库的很多特性,包括不同的数据库锁,及日志
事物是数据库提供的一套完整的数据库操作组合,满足业务的需要。利用了数据库的很多特性,包括不同的数据库锁,及日志
注意:一条记录占有select共享锁时,独占锁x锁是无法update修改此条记录的。
当记录被共享锁占有时,是不能被排他锁修改写的。必须等共享锁释放完,排他锁才能占有此记录,重新上排他锁。
当记录被共享锁占有时,是不能被排他锁修改写的。必须等共享锁释放完,排他锁才能占有此记录,重新上排他锁。
当记录被共享锁占有时,是不能被排他锁修改写的。必须等共享锁释放完,排他锁才能占有此记录,重新上排他锁。
所以事物的隔离级别,就是通过加排他锁和共享锁,锁住当前的数据,保证不能被其他事物修改。从而实现了隔离级别。
所以事物的隔离级别,就是通过加排他锁和共享锁,锁住当前的数据,保证不能被其他事物修改。从而实现了隔离级别。
所以事物的隔离级别,就是通过加排他锁和共享锁,锁住当前的数据,保证不能被其他事物修改。从而实现了隔离级别。
所以事物的隔离级别,就是通过加排他锁和共享锁,锁住当前的数据,保证不能被其他事物修改。从而实现了隔离级别。
所以事物的隔离级别,就是通过加排他锁和共享锁,锁住当前的数据,保证不能被其他事物修改。从而实现了隔离级别。
所以事物的隔离级别,就是通过加排他锁和共享锁,锁住当前的数据,保证不能被其他事物修改。从而实现了隔离级别。
不同的隔离级别是因为数据库中内部锁机制的使用方式不同,例如有的是在select完成之后立马释放锁,有的是在整个事务commit 之后释放锁 。
不同的隔离级别是因为数据库中内部锁机制的使用方式不同,例如有的是在select完成之后立马释放锁,有的是在整个事务commit 之后释放锁 。
不同的隔离级别是因为数据库中内部锁机制的使用方式不同,例如有的是在select完成之后立马释放锁,有的是在整个事务commit 之后释放锁 。
不同的隔离级别是因为数据库中内部锁机制的使用方式不同,例如有的是在select完成之后立马释放锁,有的是在整个事务commit 之后释放锁 。
update排他锁在并发场景下是串行执行的,所以要排队等待。
update排他锁在并发场景下是串行执行的,所以要排队等待。
update排他锁在并发场景下是串行执行的,所以要排队等待。
数据库事务各隔离级别加锁情况
1.单纯加锁是怎么实现 Repeatable Read 的?
1.多线程同时更新同一条记录,加X锁。所以并发场景下的 update 是串行执行的。
2.工业定义上的 select 一条记录,这个时候会在记录上加读共享锁(S锁),并到事务结束,因为在这种情况下才能实现记录在事务时间跨度上的可重复读。在读的时候不允许其他事务修改这条记录。
3.update 一条语句,这个时候会在记录上加行级排他锁(X锁),并到事务结束,这中场景下,其他读事务会被阻塞。
repeatable read加了行级锁,就防止了其他事物对单条记录的值修改,防止了不可重复读现象。但因为只是行级锁,依然不能对insert新增记录防止幻读。只有表锁才能防止。
repeatable read 加了行级锁,就防止了其他事物对单条记录的值修改,防止了不可重复读现象。但因为只是行级锁,依然不能对insert新增记录防止幻读。只有表锁才能防止。
repeatable read加了行级锁,就防止了其他事物对单条记录的值修改,防止了不可重复读现象。但因为只是行级锁,依然不能对insert新增记录防止幻读。只有表锁才能防止。
2.真实的情况是什么样子的?
读不影响写,写不影响读。
1.读不影响写:事务以排他锁的形式修改原始数据,读时不加锁,因为 MySQL 在事务隔离级别Read committed 、Repeatable Read下,InnoDB 存储引擎采用非锁定性一致读--即读取不占用和等待表上的锁。即采用的是MVCC中一致性非锁定读模式。因读时不加锁,所以不会阻塞其他事物在相同记录上加 X锁来更改这行记录。
2.写不影响读:事务以排他锁的形式修改原始数据,当读取的行正在执行 delete 或者 update 操作,这时读取操作不会因此去等待行上锁的释放。相反地,InnoDB 存储引擎会去读取行的一个快照数据。