mysql读锁,写锁,乐观锁
读锁,也叫共享锁(shared lock)
SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE
写锁,也叫排他锁(exclusive lock)
SELECT * FROM table_name WHERE ... FOR UPDATE
乐观锁,是一种逻辑锁,通过数据的版本号(vesion)的机制来实现
update t_goods
set status=2,version=version+1
where id=#{id} and version < #{version}; // 更新前将version自增
读锁、写锁属于行级锁。即事务1 对商品A 获取写锁,和事务2 对商品B 获取写锁互相不会阻塞的。需要我们注意的是我们的SQL要合理使用索引,当我们的SQL 全表扫描的时候,行级锁会变成表锁,如果where条件中只用到主键或者唯一索引,则加的是行锁;否则加的是表锁
lock in share mode适用于两张表存在业务关系时的一致性要求, for update适用于操作同一张表时的一致性要求
mqslq事务隔离级别和并发问题
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
3、幻读:系统管理员A将数据库中所有学生的成绩根据具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
mysql默认隔离级别是可重复读
select @@global.tx_isolation