首先说一下数据库事务的四大特性
1酸
事务的四大特性是酸(不是“酸“....)
<强>(1)答:原子性(原子性)强>
原子性指的是事务要么完全执行,要么完全不执行。
<>强(2)C:一致性(一致性)强>
事务完成时,数据必须处于一致的状态。若事务执行途中出的错,会回滚到之前的事务没有执行前的状态,这样数据就处于一致的状态。若事务出错后没有回滚,部分修改的内容写入到了数据库中,这时数据就是不一致的状态。
<>强(3)我:隔离性(隔离)强>
同时处理多个事务时,一个事务的执行不能被另一个事务所干扰,事务的内部操作与其他并发事务隔离。
<>强(4)D:持久性(耐久性)强>
事务提交后,对数据的修改是永久性的。
2 Mysql的锁
Mysql的锁其实可以按很多种形式分类:
-
<李>按加锁机制分,可分为乐观锁与悲观锁。李>
<李>按兼容性来分,可分为X锁与锁。李>
<李>按锁粒度分,可分为表锁,行锁,页锁。李>
<李>按锁模式分,可分为记录锁,锁的差距,第二个关键锁,意向锁、插入意向锁。李>
这里主要讨论年代锁,X锁,乐观锁与悲观锁。
(1) S锁与X锁
<强> S锁与X锁是InnoDB引擎实现的两种标准行锁机制>强。查看默认引擎可使用
<代码类=" sql语言">显示变量如% storage_engine %的;代码>
作者的mysql版本为8.0.17,结果如下:
先建好测试库与测试表,很简单,表就两个字段。
<代码类=" sql语言">创建数据库测试; 使用测试; 创建表 ( id auto_increment int主键, 钱int );代码>
Ⅰ.S锁
<强> S锁也叫共享锁,读锁,数据只能被读取不能被修改。强>
玩一下,上锁!
<代码类=" sql语言">锁表读;代码>
然后.....
只能读不能改,删,也不能增。
Ⅱ.X锁
<强> X锁也叫排他锁,写锁,一个事务对表加锁后,其他事务就不能对其进行加锁与增删查改操作。强>
设置手动提交,开启事务,X锁上。
<代码类=" sql语言">设置autocmmmit=0; 开始事务; 锁表写;代码>
在开启另一个事务,使语用选择句。
<代码类=" sql语言">设置自动提交=0; 开始事务; select *的;代码>
这里是阻塞选择操作,因为一直都没释放X锁。
同样也不能再加锁,也是阻塞中。
回到原来那个加锁的事务,嗯,什么事也没有,正常读写。
释放锁后:
<代码类=" sql语言">解锁表;代码>
在另一个事务中可以看到中断时间。