失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > c 并发操作mysql_MySQL并发控制

c 并发操作mysql_MySQL并发控制

时间:2021-04-14 07:18:19

相关推荐

c 并发操作mysql_MySQL并发控制

1.读写锁

1)读锁也叫共享锁,写锁也叫排他锁

2)读锁:相互不阻塞,多用户可以同时读取

3)写锁:会阻塞其他读锁和写锁,给定时间内只有一个用户写入,其他用户不能读写

2.锁粒度

1)锁粒度:一种提高共享资源并发性的方式,让锁定对象更有选择性.

a尽量只锁定需要修改的部分数据,而不是所有的资源

b最理想的方式是只对修改的数据片进行精确的锁定

c加锁也会消耗资源,用于获得锁,检查锁是否接触,释放锁等操作.

d如果系统花费大量的时间来管理锁,而不是存取数据,那么系统的性能可能会因此受到影响

2)锁策略:在锁的开销和数据安全性直接寻求平衡,一般使用行级锁row-level-lock

3)表锁(table lock)

a最基本的,开销最小的策略

b写锁优先级比读锁高,写锁请求可能会被插入到读锁前面

c服务器会为alter table等语句使用表锁而忽略存储引擎的锁机制

4)行级锁(row lock)

a最大程度支持并发处理,开销代价也变大

b只在存储引擎层实现,而服务器层没有实现(InnoDB,XtraDB等引擎)

3.LOCK TABLES和UNLOCK TABLES

1)ORACLE与SQL Server数据库当中没有这种语法

2)在MySQL服务器层实现的,与存储引擎无关

3)命令格式LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} [, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}] ...

a修饰符LOW_PRIORITY用于之前版本的MySQL,它会影响锁定行为,但是从MySQL 5.6.5以后,这个修饰符已经被弃用。如果使用它则会产生警告

b一个线程获得在一个表上的read锁

l该线程和所有其他线程只能从表中读数据

l当前线程执行写insert和更新update操作都会报错:ERROR 1099 (HY000): Table 'test' was locked with a READ lock and can't be updated

l其他线程执行写insert和更新update操作都会被阻塞,直到释放资源后执行

c一个线程获得在一个表上的read local锁

l该线程和所有其他线程只能从表中读数据

l当前线程执行写insert和更新update操作都会报错:ERROR 1099 (HY000): Table 'test' was locked with a READ lock and can't be updated

l其他线程可以进行写insert操作,但是更新update操作被阻塞,直到释放资源后执行

d对于事务型表,如InnoDB表,READ LOCAL与READ相同,因为MySQL的默认事务级别为REPEATABLE COMMITTED

e一个线程在一个表上得到一个WRITE锁,那么只有拥有这个锁的线程可以从表中读取和写表。其它的线程被阻塞

4)unlock tables;会解锁当前线程的所有锁 特别注意:lock tables和事务互相影响可能会产生无法预料的结果,因此建议除了事务禁用了AUTOCOMMIT,其他时候不要显式使用lock tables

如果觉得《c 并发操作mysql_MySQL并发控制》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。