0
点赞
收藏
分享

微信扫一扫

8、MySQL锁机制、事务

并发机制
锁机制

锁类型:
读锁:共享锁,也成为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_TRX\G

死锁:两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态
如何解决:数据库会选择一个事务牺牲掉,完成一个事务,撤销掉其他的事务
或者用select * from information_schema INNODB_TRX\G查看是哪个进程一直在开启着事务没有关闭,导致死锁
用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两个隔离级别下工作
举报

相关推荐

0 条评论