数据库 锁问题
MyISAM 只有表锁
读锁 也叫共享锁
MyISAM表查询会加表锁 导致其他的 inster update 等待
lock tables 表 read|write; 加锁 unlock tables;解锁
MyISAM 上了写锁 其他都需要等待 这个写锁也加 排它锁
select 上 排它锁 select * from 表 for update;
innoDB 有表锁 有行锁
查看是否自动提交事务后解锁 show variables like 'autocommit';
关闭自动提交 set autocommit = 0 ;(只针对当前session(一个窗口一个sql session),)
另一个 begin transaction ; sql ; commit;(打开事务)
事务提交后 会自动释放锁。(事务和锁俩个概念,事务经常用,锁一般自动控制了,也可手动干预加锁解锁)
查询上读锁 select * from 表 lock in share mode;(非共享读锁)
手动实现乐观锁
给数据价格version字段 默认为0 代码里面首先读到id=1 的 version 为0 更新时set version = 0+1 并且where条件为 id=1 and version = 0 ,
另一个程序假如执行过查询version 为0 并更新 set version = 0+ 1 where id=1 and version = 0 后,数据库的 id= 1的version = 1了,那么第一个 更新的sql就更新影响行数为0,使用业务代码来判断失败就可以了。
数据库事务的四大特效
持久性 对事务的提交保存,是会被完整记录到的,不会提交了事务 突然断电数据未更新的情况~~~ innoDB数据库重启时会在 redo log file 文件中对事务进行重做!!!
查看session隔离级别 select @@tx_isolation;
设置当前session 的隔离级别 set session transaction isolation level read uncommitted;
read uncommitted(未提交读)
MySql事务开始BEGIN和START TRANSACTION网上都不少人使用,到底它们有什么区别呢,以下是一些常用的用法;
事务的开始: BEGIN或START TRANSACTION都是显式开启一个事务; 事务的提交: COMMIT或COMMIT WORK都是等价的; 事务回滚: ROLLBACK或ROLLBACK WORK也是等价的;