读写锁:
在处理并发读或者写,可以通过实现一个由两种类型的锁组成的锁系统来解决;
共享锁也叫读锁(shared lock/read lock):读锁是共离的或者说是相互不阻塞的;
排他锁也叫写锁(exclusive lock/write lock):写锁是排他的,也就是说一个写锁会阻塞其它的写锁及读锁;只有这样才能确保在给定的时间里,只有一个用户能执行写入,并防止其它用户读取正在写入的同一资源;
锁粒度:
表锁(table lock):mysql中最基本的锁策略,并且是开锁最小的策略。 它会锁定整张表,一个用户在对表进行写操作(insert,delete,update,alter等)前,需要先获得写锁,这会阻塞其它用户对该表的所有读写操作。只有没有写锁时,其它读取的用户才能获得读锁,读锁之间是不相互阻塞的。写锁比读锁有更高的优先级,因此一个写锁请求可能会被插入到写锁的前面。 myisam上可以实现表锁;
行级锁(row lock):可能最在程度地支持并发处理(同时也带来了最大的锁开销),innodb上可以实现行锁;
在给定的资源上,锁定的数据量越少,则系统的并发程度越高,只要相互不发生冲突即可。
由于锁定和解锁需要消耗资源,所以具体怎么选择,要看实际情况。
事务:
事务内部的语句,要么全部执行成功,要么全部执行失败;
事务的特性:ACID
原子性:对于一个事务来说,不可能只执行其中的一部分操作;
一致性:数据库总是从一个一致性的状态转换到另一个一致性的状态。
隔离性:通常来说(看隔离级别),一个事务所做的修改在最终提交前,对其它事务是不可见的。
持久性:一旦事务提交了,则其所做的修改就会永久保存到数据库中。
隔离级别:
read uncommited(未提交读):此级别中,事务的修改,即使没有提交,对其他事务也都是可见的 。事务可以读取未提交的数据,这种现象被称为脏读。问题较多,一般很少用这种级别;
read committed(提交读):大多数数据库的默认隔离级别。 一个事务从开始直到提交前,所做的任何修改对其它事务都是不可见的。 可能出现两次执行同样的查询,会得到不一样的结果。
repeatable read(可重复读):解决了脏读问题,保证在同一个事务中多次读取同样的记录结果是一致的。 但是无法解决幻读问题:当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。 innodb和xtradb存储引擎通过多版本并地控制解决了幻读的问题。
serializable(可串行化):最高的隔离级别,它通过强制事务串行执行,避免了前面说的幻读问题;它会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用问题,实际中很少用到。
- 相关文章
- find_in_set在集合中查找
- sql查询自定义排序field函数
- sql显示表结构及索引
- sql修改表
- 添加、删除索引
- sql分组
- sql子查询
- sql多表更新
- sql建表同时插入数据
- sql多表删除
- 热门文章
- win7中将文件拷贝到虚拟机linux下
- phpexcel设置行高及列宽,背景颜色,
- rabbitmq无法启动
- intellij idea不显示git push按钮
- php7中使用mongodb的aggregate进行
- laravel页面静态化的方法
- centos7.4 64位下swoole安装及配置
- navicate连接mycat报1184错误
- curl设置超时不起作用(CURLOPT_TIM
- devops-jenkins容器为pending状态
- 好评文章
- phpexcel设置行高及列宽,背景颜色,
- php7中使用mongodb的aggregate进行
- intellij idea打开文件所在文件夹
- windows下使用MongoDB Compass Com
- win7中将文件拷贝到虚拟机linux下
- laravel 中悲观锁 & 乐观锁的使用
- 单点登录sso原理及php实现方式及de
- navicate连接mycat报1184错误
- rabbitmq无法启动
- laravel整合dingo/api方法步骤:jwt
- 我的项目
- 【github】www.github.com/hurong241
- 【码云】gitee.com/hu_rong/projects
- 【docker hub】hub.docker.com/repositories/hurong241
- 【packagist】packagist.org/users/hurong241/packages
- 站点信息
- 建站时间:2011年
- 文章数:623篇
- 浏览数:1303109