线程池核心参数public ThreadPoolExecutor( int corePoolSize, // 核心线程数 int maximumPoolSize, // 全局锁sqlflush tables with read lock执行后整个数据库就处于只读状态了这时其他线程执行以下操作都会被阻塞对数据的增删改操作比如 insert、delete、update等语句对表结构的更改操作比如 alter table、drop table 等语句。全局锁主要应用于做全库逻辑备份这样在备份数据库期间不会因为数据或表结构的更新而出现备份文件的数据与预期的不一样。但是加上全局锁后整个数据库都是只读状态无法更新数据。因此一般也不建议用全局锁进行全库逻辑备份。InnoDB支持可重复读的隔离级别那么在备份数据库之前可以先开启事务会先创建 Read View然后整个事务执行期间都在用这个 Read View而且由于 MVCC 的支持备份期间业务依然可以对数据进行更新操作。因为在可重复读的隔离级别下即使其他事务更新了表的数据也不会影响备份数据库时的 Read View这就是事务四大特性中的隔离性这样备份期间备份的数据一直是在开启事务时的数据。表级锁innodb的 表锁分成意向共享锁 和意向独占锁表锁是innodb引擎⾃动加的不⽤⾃⼰加。意向共享锁加共享⾏锁时必须先加意向共享锁意向独占锁 给某⾏加独占锁时必须先给表加意向独占锁。insert、update、deleteinnodb会⾃动给那⼀⾏加⾏级独占锁。普通的select啥锁都不加。但是可以手动加锁sql//先在表上加上意向共享锁然后对读取的记录加共享锁 select ... lock in share mode; //先在表上加上意向独占锁然后对读取的记录加独占锁 select ... for update;行级锁InnoDB 引擎是支持行级锁的而 MyISAM 引擎并不支持行级锁。普通的 select 语句是不会对记录加锁的因为它属于快照读。如果要在查询时对记录加行锁可以使用下面这两个方式这种查询会加锁的语句称为当前读。sql//对读取的记录加共享锁 select ... lock in share mode; //对读取的记录加独占锁 select ... for update;共享锁S锁满足读读共享读写互斥。独占锁X锁满足写写互斥、读写互斥。行级锁的类型主要有三类Record Lock记录锁也就是仅仅把一条记录锁上Gap Lock间隙锁锁定一个范围但是不包含记录本身左开右开区间Next-Key LockRecord Lock Gap Lock 的组合锁定一个范围并且锁定记录本身。左开右闭区间Record LockRecord Lock 称为记录锁锁住的是一条记录。而且记录锁是有 S 锁和 X 锁之分的当一个事务对一条记录加了 S 型记录锁后其他事务也可以继续对该记录加 S 型记录锁S 型与 S 锁兼容但是不可以对该记录加 X 型记录锁S 型与 X 锁不兼容;当一个事务对一条记录加了 X 型记录锁后其他事务既不可以对该记录加 S 型记录锁S 型与 X 锁不兼容也不可以对该记录加 X 型记录锁X 型与 X 锁不兼容。总而言之当一个事务对一条记录加了读锁后其它事务也可读但不可写当一个事务对一条记录加了写锁后其它事务不可读也不可写。Gap LockGap Lock 称为间隙锁只存在于可重复读隔离级别目的是为了解决可重复读隔离级别下幻读的现象。假设表中有一个范围 id 为35间隙锁那么其他事务就无法插入 id 4 这条记录了这样就有效的防止幻读现象的发生。Next-Key LockNext-Key Lock 称为临键锁是 Record Lock Gap Lock 的组合锁定一个范围并且锁定记录本身。假设表中有一个范围 id 为35] 的 next-key lock那么其他事务即不能插入 id 4 记录也不能修改 id 5 这条记录乐观锁和悲观锁乐观锁和悲观锁都是针对读select来说的。乐观锁就是非常乐观做什么事都往好处想 对于数据库操作就认为每次操作数据的时候都认为别的操作不会修改所以不会加锁而是通过一个类似于版本的字段来标识该数据是否修改过在执行本次操作前先判断是否修改过如果修改过就放弃本次操作重新再来。乐观锁适用于多读的应用类型这样可以提高吞吐量;乐观锁策略:提交版本必须大于记录当前版本才能执行更新。乐观锁不是数据库自带的需要自己去实现。乐观锁是指 更新数据库时认为操作不会导致冲突在操作数据时不加锁而在进行更新后再去判断是否有冲突了。通常实现是这样的在表中的数据进行更新时先给数据表加一个版本(version)字段每操作一次将那条记录的版本号加1。先查询出那条记录获取出version字段。如果要对那条记录进行更新操作则先判断此刻version的值是否与刚刚查询出来时的version的值相等。如果相等则说明这段期间没有其他程序对其进行操作则可以执行更新将version字段的值加1。如果version值与刚刚获取出来的version的值不相等则说明这段期间已经有其他程序对其进行操作了则不进行更新操作。悲观锁就是非常悲观做什么事都觉得不好悲观锁就是在操作数据时每次操作数据数据都会认为别的操作会修改当前数据所以在进行每次操作时都要加锁才能进行对相同数据的操作这点跟java中的synchronized很相似所以悲观锁需要耗费较多的时间。悲观锁涉及到的另外两个锁就是共享锁与排它锁select **** for update。共享锁和排它锁是悲观锁的不同的实现它俩都属于悲观锁的范畴。因此悲观锁在未通过索引条件检索数据时会全表扫描于是就会对所有记录加上 next-key 锁记录锁 间隙锁相当于把整个表锁住了。导致其他程序不允许“加锁的查询操作”影响吞吐。故如果在查询居多的情况下推荐使用乐观锁。