并发机制
锁机制
锁类型:
读锁:共享锁,也成为s锁,只读不可写(包括当前事务),多个读互补阻塞
写锁:独占锁,排它锁,也称为 X 锁,写锁会阻塞其它事务(不包括当前事务)的读和写
加锁:read和write
加读锁
如:lock tables students read;都能读但不能写,自己写会报错,别人写会等待你解锁,直到等待超时
释放锁:
unlock tables;释放之后,另一会话的修改就可以执行了
加写锁
如:lock tables students write;自己读改不影响,但别人读改不行。
不写表名进行全局加锁变成只读:flush table with read lock;意味着谁也无法去修改,包括自己在内
(myisam)通常在备份前加锁,防止在备份时其他人更改表,因为它不支持事务等
Innodb不需要加,InnoDB支持事务,同时在两个终端对同一行记录修改,只能有一个修改成功
事务
一组原子性的SQL语句,或一个独立工作单元
事务日志:记录事务信息,实现undo,redo等故障恢复功能
事务特性 事务有多少个特性?
ACID特性:
A:atomicity 原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚
C:consistency 一致性;数据库总是从一个一致性状态转换为另一个一致性状态,类似于能量守恒定律
I:Isolation 隔离性;一个事务所做出的操作在提交之前,是不能为其它事务所见;隔离有多种隔离 级别,实现并发
D:durability 持久性;一旦事务提交,其所做的修改会永久保存于数据库中
事务的生命周期
1、事务刚开始,数据处于初始状态
2、开始事务--事务里面会发生一些增删改查,事务没有结束之前,可以使用rollback回滚撤销,或者commit提交,进入到新状态。
结束事务两种方式 rollback 回滚到之前的状态
commit 提交进入新状态
事务管理
显示启动事务:(只作用于DML中,即insert、update、delete中,不做用于DDL中,create、drop、alter执行后不可恢复)
begin
结束事务:
commit 提交,相当于vi中wq保存退出
rollback 回滚,相当于vi中去q!不保存退出
启动事务后,更改数据在没有提交或回滚之前,更改的数据叫做脏数据,由于隔离性的原因,其他会话看不到更改的数据。
在事务下进行大量数据处理,比不开事务效率高
自动提交:set autocommit=1|0 默认为1,为0时设为非自动提交,建议使用非自动提交,
select @@autocommit;查看事务状态
查看当前正在进行的任务:select * from information_schema INNODB_TRXG
死锁:两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态
如何解决:数据库会选择一个事务牺牲掉,完成一个事务,撤销掉其他的事务
或者用select * from information_schema INNODB_TRXG查看是哪个进程一直在开启着事务没有关闭,导致死锁
用kill杀死 kill 线程号; kill之前打好招呼,看还有人用不
show processlist;查看线程号
查看事务锁的超时时长,默认50s
show global variables like 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50 |
+--------------------------+-------+
事务隔离级别 请问事务隔离级别有哪几个,分别产生什么。
MySQL 支持四种隔离级别,事务隔离级别从上至下更加严格
隔离级别 |
脏读 |
不可重复读 |
幻读 |
加锁读 |
读未提交 |
可以出现 |
可以出现 |
可以出现 |
否 |
读提交 |
不允许出现 |
可以出现 |
可以出现 |
否 |
可重复读 |
不允许出现 |
不允许出现 |
可以出现 |
否 |
序列化 |
不允许出现 |
不允许出现 |
不允许出现 |
是 |
read uncommitted 可读取到未提交数据,产生脏读
read committed
可读取到提交数据,但未提交数据不可读,产生不可重复读,即可读取到多个提交数据,导致每次读取数据不一致
repeatable read
可重复读,多次读取数据都一致,产生幻读,即读取过程中,即使有其它提交的事务修改数据,仍只能读取到未修改前的旧数据.此为MySQL默认设置
serializable
可串行化,未提交的读事务阻塞写事务(加读锁,但不阻塞读事务),或者未提交的写事务阻塞读 和写事务(加写锁,其它事务的读,写都不可以执行).会导致并发性能差 开启后,一个事务开启,另外的事务就不能用了。
四种隔离级别,第三种隔离级别是系统默认的。 第一个没有安全性,第四个太严格了
第一级别产生脏读。第二级别产生不可重复读,第三级别产生幻读,第四级别未提交的读事务阻塞写事务
如何查看事务隔离级别:select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ |
+-------------------------+
如何更改事务隔离级别:set transaction_isolation='read uncommitted|read committed|repeatable read|serializable
或者写在配置文件中:
[mysqld]
transaction_isolation="read committed"
MVCC(多版本并发控制机制)只能与read committed和repeatable read两个隔离级别下工作
服务器租用托管,机房租用托管,主机租用托管,https://www.e1idc.com