Linux九阴真经之九阴白骨爪残卷11(并发访问控制和事务Transactions)
一、并发访问控制
实现的并发访问的控制技术是基于锁;
锁分为表级锁和行级锁,MyISAM存储引擎不支持行级锁;InnoDB支持表级锁和行级锁;
锁的分类有读锁和写锁,读锁也被称为共享锁,加读锁的时候其他的人可以读;写锁也称为独占锁或排它锁,一个写锁会阻塞其他读操作和写操作;
锁还分为隐式锁和显式锁,隐式锁由存储引擎自行管理,显式锁是用户手动添加锁;
锁策略:在锁粒度及数据安全性寻求的平衡机制。
显式锁的使用方法:LOCK TABLES tbl_name READ|WRITE
MariaDB [school]> LOCK TABLES students READ; #加读锁 MariaDB [school]> UNLOCK TABLES; #解锁
读锁:任何人都不可写
写锁:自己可以读写,但是其他人不可读写
FLUSH TABLES tb_name :关闭正在打开的表(清除查询缓存),通常在备份前加全局读锁
SELECT clause [FOR UPDATE | LOCK IN SHARE MODE] 查询时加写或读锁
二、事务Transactions
一组原子性的SQL语句,或一个独立工作单元
1、事务遵循ACID原则:
- A:atomicity原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚
- C:consistency一致性;数据库总是从一个一致性状态转换为另一个一致性状态
- I:Isolation隔离性;一个事务所做出的操作在提交之前,是不能为其它事务所见;隔离有多种隔离级别,实现并发
- D:durability持久性;一旦事务提交,其所做的修改会永久保存于数据库中
2、事务的生命周期
显式事务:明确的规定事务的开始
隐式事务:默认为隐式事务,每执行完一句语句后直接提交
autocommit = {OFF|ON} 开启或关闭自动提交,建议使用显式请求和提交事务,而不要使用“自动提交”功能
启动事务:START TRANSACTION;
插入标签:ROLLBACK TO ##;
撤销回指定标签:ROLLBACK TO ##;
全部撤销:ROLLBACK;
提交事务:COMMIT;
删除标签:RELEASE SAVEPOINT;
MariaDB [school]> START TRANSACTION; #明确指明启动一个事务 MariaDB [school]> INSERT students(StuID,Name,Age,Gender) VALUES (26,'Tom',22,'M'); #添加一条记录 MariaDB [school]> SAVEPOINT sp26; #插入一个标签 MariaDB [school]> INSERT students(StuID,Name,Age,Gender) VALUES (27,'Maria',12,'F'); #再加入一条记录 MariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27); #查看一下,可以看到刚刚插入的数据 +-------+-------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+-------+-----+--------+---------+-----------+ | 26 | Tom | 22 | M | NULL | NULL | | 27 | Maria | 12 | F | NULL | NULL | +-------+-------+-----+--------+---------+-----------+ MariaDB [school]> ROLLBACK TO sp26; #撤销到sp26标签之前的状态 MariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27); #查看一下,刚刚maria的信息被撤回了 +-------+------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+------+-----+--------+---------+-----------+ | 26 | Tom | 22 | M | NULL | NULL | +-------+------+-----+--------+---------+-----------+ MariaDB [school]> COMMIT; #提交事务 MariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27); #最终的数据 +-------+------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+------+-----+--------+---------+-----------+ | 26 | Tom | 22 | M | NULL | NULL | +-------+------+-----+--------+---------+-----------+
3、事务的隔离级别
- READ UNCOMMITTED 其他事务可以看到未提交的脏数据,产生脏读
- READ COMMITTED 提交后其他事务可以看到修改后的数据,每次读取的数据可能不一致,不可重复读
- REPEATABLE READ 可重复读,每次看到的数据都一致,数据被修改后看不到最新数据,会产生幻读(默认设置)
- SETIALIZABILE 未提交的读事务阻塞修改事务,串行执行,并发性差
MVCC: 多版本并发控制,和事务级别相关
修改事务隔离级别:服务器变量tx_isolation指定,默认为REPEATABLE-READ,可在GLOBAL和SESSION级进行设置
tx_isolation
- Description: The transaction isolation level. See also SET TRANSACTION ISOLATION LEVEL.
- Commandline:
--transaction-isolation=name
- Scope: Global, Session
- Dynamic: Yes
- Type: enumeration
- Default Value:
REPEATABLE-READ
- Valid Values:
READ-UNCOMMITTED
,READ-COMMITTED
,REPEATABLE-READ
,SERIALIZABLE
MariaDB [school]> SELECT @@tx_isolation; #默认为可重复读级别 +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ MariaDB [school]> SET tx_isolation='READ-UNCOMMITTED'; MariaDB [school]> set tx_isolation='READ-COMMITTED'; MariaDB [school]> set tx_isolation='REPEATABLE-READ'; MariaDB [school]> set tx_isolation='SERIALIZABLE';
4、死锁
两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态会发生死锁
在A事务修改t1表的第3行,B事务修改t2表的第2行时;这时A事务去修改t2表的第2行,这时就把A事务阻塞了,然后B事务有刚刚好去修改t1表的第3行,这时B事务也被阻塞了,这时就产生了死锁。
俩个事务同时去更改对方的修改的表,互相阻塞;系统会发现死锁,会自动牺牲一个代价小的事务来解开死锁。
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
查看进程列表:MariaDB [school]> SHOW PROCESSLIST;
杀死进程:MariaDB [school]> KILL 5;
转载于:https://www.cnblogs.com/huxiaojun/p/9188889.html
Linux九阴真经之九阴白骨爪残卷11(并发访问控制和事务Transactions)相关推荐
- Linux九阴真经之九阴白骨爪残卷2(SSH)
SSH ssh:安全的远程登录 两种方式的用户登录认证 基于passwork 基于key 客户端 常见的客户端工具有:Windows版的putty.securecrt.xshell:linux中有ss ...
- Linux九阴真经之九阴白骨爪残卷13(LVM的备份还原,恢复最新状态)
一.备份策略 1.备份的类型 类型1: 热备份:读写不受影响(MyISAM不支持热备,InnoDB支持热备) 温备份:仅可以执行读操作 冷备份:离线备份,读写操作均中止 类型2: 物理备份:复制数据文 ...
- Linux九阴真经之九阴白骨爪残卷4(自动化运维之ansible用法一)
ansible是什么? ansible是什么? 它是一个配置管理工具,也是一个自动化运维工具. ansible能做什么? ansible 可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工 ...
- Linux九阴真经之九阴白骨爪残卷5(ansible用法二之Playbook和YAML语法)
playbook是由一个或多个"play"组成的列表 play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色.从根本上来讲,所谓task无 ...
- Linux九阴真经之九阴白骨爪残卷14(备份和恢复)
备份还原案例 前提:log_bin=ON 一.早上上班后误删数据库,如何恢复最新状态 1.假设早上已经完成备份 (开启二进制),然后在students表里新增了一条数据 [root@centos7 ~ ...
- Linux九阴真经之九阴白骨爪残卷1(加密和安全)
CA和证书 1.KPI :公共秘钥体系 签证机构:CA 注册机构:RA 证书吊销列表:CRL 证书存取库 509:定义了证书的结构以及认证协议标准 版本号 序列号 签名算法 ...
- Linux九阴真经之九阴白骨爪残卷3(自动化运维之系统安装)
安装程序 CentOS系统安装 系统启动流程: bootloader-->kernel(initramfs)-->rootfs-->/sbin/init anaconda: 系统安装 ...
- Linux九阴真经之九阴白骨爪残卷3(DHCP、TFTP服务的安装与启动以及PXE安装Centos7)...
DHCP实现 一.首先准备两台linux,一台做dhcp服务器,另一台做客户端(将服务器的桥接网卡禁用),并取消虚拟机的HPC服务 二.将服务器端的IP设置为静态IP,取消DHCP服务(不写默认为取消 ...
- Linux九阴真经之摧心掌残卷11(rpm和yum包管理)
一.rpm包管理器 rpm是一个功能强大的包管理工具,可用于构建,安装,查询,验证,更新和卸载软件包. 用法: rpm [OPTION...] 例 rpm -ivh +包名 配置文件: /var/l ...
最新文章
- python回归算法_机器学习算法之回归详解
- 交换机工作原理(下)
- 微服务下的容器部署和管理平台Rancher
- python栈是什么意思_Python数据结构——栈
- PyTorch随笔-0
- 今日arXiv精选 | 14 篇 ICCV 2021 最新论文
- Python爬虫用Selenium抓取js生成的文件(一)
- 基于RDMA和NVM的大数据系统一致性协议研究
- 将2019拆分成三个整数的平方和
- centos安装mysql-python_在Centos上安装mysql python
- erlang四大behaviour之四-supervisor(转载)
- OSChina 周日乱弹 —— 普通人如何面对持刀歹徒
- Majority Number III
- pip下载opencv报错
- 倒序输出数组 (彩蛋:抖机灵)
- 欢迎各位到我的qq空间http://user.qzone.qq.com/504501772/infocenter 指点
- openwt dns 解析部分域名出错问题。
- 花指令的原理和常用花指令收集
- 接口测试的标准和规范性
- 小强IT游记之大连行