事务
- 事务
- 为了启动一个事务,你使用
START TRANSACTION
语句。BEGIN
或BEGIN WORK
是START TRANSACTION
的别名。 - 要提交当前事务并使其变化永久化,你要使用
COMMIT
语句。 - 要回滚当前事务并取消其变化,你可以使用
ROLLBACK
语句。 - 要禁用或启用当前事务的自动提交模式,你可以使用
SET autocommit
语句
- 为了启动一个事务,你使用
START TRANSACTION;
/*执行语句*/
COMMIT;
/*回滚语句*/
ROLLBACK;
/*关闭自动提交*/
SET autocommit = 0;
--OR--
SET autocommit = OFF;
/*启动自动提交*/
SET autocommit = 1;
--OR--
SET autocommit = ON;
锁
- 认识锁
概念:计算机协调多个进程或线程并发访问某一资源的机制
锁的重要性:在数据库中,除了传统的计算资源(CPU、RAM、I\O等)的争抢,数据也是一种供多用户共享的资源。
因此,如何保证数据并发访问的一致性,有效性,是所有数据库必须要解决的问题
锁的缺点:加锁是消耗资源的,锁的各种操作,包括:获得锁、检测锁是否已经解除、释放锁等,都会增加系统的开销
查看数据库使用什么级别事务锁隔离
SHOW VARIABLES like '%isolation%'
-
锁的类型
自增锁- **0**:`traditonal` 每次 `insert` 语句执行都会产生表锁 - **1**:`consecutive simple insert` 会获得批量的锁,保证一批插入自增序列的连续性,插入之前提前释放锁,在这个模式下你会发现当你 `insert` 多条数据回滚的时候虽然 DB 没有插入数据,但是自增 ID 已经增长了,也是数据库默认的级别
-
- 2:
interleaved
不会锁表,实时插入,并发最高,但是基于主从的复制是不安全的,感兴趣可以去查询 RBR 和 SBR 的优缺点
- 2:
-
show variables like '%innodb_autoinc_lock_mode%'
-
- innodb_autoinc_lock_mode = 0
在这一模式下,所有的 insert 语句都要在语句开始的时候得到一个表级的 auto_inc 锁,在语句结束的时候才释放
这种模式下 auto_inc
锁一直要保持到语句的结束,所以这个就影响到了并发的插入
但是主从同步时候是安全的
-
- innodb_autoinc_lock_mode = 1
这一模式下去 simple insert
做了优化,由于 simple insert
一次性插入值的个数可以立马得到确定,所以 MySQL
可以一次生成几个连续的值,用于这个 insert
语句,也保证主从同步基于语句的复制安全
这一模式也是 MySQL
的默认模式,这个模式的好处是 auto_inc
锁不要一直保持到语句的结束,只要语句得到了相应的值后就可以提前释放锁
-
- innodb_autoinc_lock_mode = 2
无自增锁ÿ