Mysql InnoDB-锁定场景

Mysql InnoDB-锁定场景,mysql,transactions,innodb,Mysql,Transactions,Innodb,我是一名开发人员,对数据库只有相当的了解。我需要了解InnoDB中的事务级锁定机制 我听说InnoDB使用行级锁定?据我所知,它锁定事务中的特定行。在进行表更新时,select语句会发生什么情况 例如,假设有事务和select语句都是从两个不同的进程触发的,并假设Transaction1在select语句发出之前启动 Transaction1 : Start Update table_x set x = y where 1=1 Transaction1 : End 选择查询 Select x

我是一名开发人员,对数据库只有相当的了解。我需要了解InnoDB中的事务级锁定机制

我听说InnoDB使用行级锁定?据我所知,它锁定事务中的特定行。在进行表更新时,select语句会发生什么情况

例如,假设有事务和select语句都是从两个不同的进程触发的,并假设Transaction1在select语句发出之前启动

Transaction1 : Start
Update table_x set x = y where 1=1
Transaction1 : End
选择查询

Select x from table_x
select语句将发生什么情况。它将在事务1发生期间或完成之后返回值?如果它只能在事务1结束后开始,那么图中的行级锁定在哪里


我说的有道理还是我的基本理解本身是错误的?请告知。

选择从事务外部启动的
将看到事务启动前的表格。只有在提交transsaction后,它才会看到更新的值。

选择从事务外部启动的
将看到事务启动前的表格。只有在提交transsaction之后,才会看到更新的值。

选择不会等待事务完成,而是返回行的当前值(即,在事务开始之前)

如果希望选择等待事务完成,可以使用“共享模式下锁定”:

这将导致select等待当前被持有独占(更新/删除)锁的事务锁定的任何行

在共享模式下锁定执行的读取读取最新的可用数据 并对读取的行设置共享模式锁。共享模式锁 防止其他人更新或删除读取的行。此外,如果 最新数据属于另一方尚未提交的事务 会话中,我们等待该事务结束


选择不会等待事务完成,而是返回行的当前值(即,在事务开始之前)

如果希望选择等待事务完成,可以使用“共享模式下锁定”:

这将导致select等待当前被持有独占(更新/删除)锁的事务锁定的任何行

在共享模式下锁定执行的读取读取最新的可用数据 并对读取的行设置共享模式锁。共享模式锁 防止其他人更新或删除读取的行。此外,如果 最新数据属于另一方尚未提交的事务 会话中,我们等待该事务结束


这取决于隔离级别

SERIALIZABLE 
REPEATABLE READS 
READ COMMITTED 
READ UNCOMMITTED
很好的解释


mySQL取决于隔离级别

SERIALIZABLE 
REPEATABLE READS 
READ COMMITTED 
READ UNCOMMITTED
很好的解释


mySQL不仅依赖于所涉及的锁定,还依赖于隔离级别,该级别使用锁定来提供ACID标准定义的事务隔离。InnoDB不仅使用锁定,还使用行的多版本控制来加速事务

serializable
隔离级别中,它将在更新时使用读锁,因此select必须等待第一个事务完成。但是,在较低的隔离级别上,锁将被写入,并且不会阻止选择。在
repeatable read
read committed
中,如果记录被更新,它将扫描回滚日志以获取记录的上一个值;在
read uncommitted
中,它将返回当前值

表级锁定和行级锁定的区别在于有两个事务运行更新查询。在表级锁定中,第二个表必须等待第一个表,因为整个表都被锁定。在行级锁定中,只有与where子句*匹配的行(以及它们之间的一些间隙,但这是另一个主题)才会被锁定,这意味着不同的事务可以更新表的不同部分,而无需彼此等待


*假设索引覆盖where子句,它不仅取决于所涉及的锁定,还取决于隔离级别,该级别使用锁定来提供ACID标准定义的事务隔离。InnoDB不仅使用锁定,还使用行的多版本控制来加速事务

serializable
隔离级别中,它将在更新时使用读锁,因此select必须等待第一个事务完成。但是,在较低的隔离级别上,锁将被写入,并且不会阻止选择。在
repeatable read
read committed
中,如果记录被更新,它将扫描回滚日志以获取记录的上一个值;在
read uncommitted
中,它将返回当前值

表级锁定和行级锁定的区别在于有两个事务运行更新查询。在表级锁定中,第二个表必须等待第一个表,因为整个表都被锁定。在行级锁定中,只有与where子句*匹配的行(以及它们之间的一些间隙,但这是另一个主题)才会被锁定,这意味着不同的事务可以更新表的不同部分,而无需彼此等待


*假设索引覆盖where子句,我认为Select不会导致任何结果,它也会返回结果InnoDB动态处理事务,您不必为单个查询指定使用START transaction和end COMMIT的显式事务。但是,启动事务将应用一个锁,该锁只能在COMMIT@MaheshPatil:非常好的一点,我已经更新了问题。我认为Select不会导致任何问题,它会返回结果,InnoDB也会动态处理事务,您不必指定