mysql不加事务锁表_MySQL性能与非事务表的表锁定

本文介绍了MySQL中非事务性表如何通过锁定实现类似事务处理的效果,包括表的读锁和写锁的使用,以及如何避免死锁,确保多线程环境下数据的一致性。
摘要由CSDN通过智能技术生成

事务性数据库比非事务性数据库复杂一些。

提高性能:

1.使用小事务,每当一个小事务执行完,下一个小事务就可以继续执行

2.选择合适的隔离级别。对关键的,安全性要求特别高的,用隔离级别小的隔离级别

3.保证所有的事务是可行的,否则bock住,影响其他事务执行

4.避免死锁:多线程的程序开发中。多个事务之间互相死锁占用资源。

mysql中的锁?

在mysql中是有锁的,有的存储引擎不支持事务安全的,比如mysam存储引擎。有时候想实现类似于事务处理的,可以用mysql锁的方式实现类似于事务处理的效果。

在mysql中锁有很多种,比如表的锁定,页面的锁定(mysql数据库分页面显示),行的锁定。

非事务性的表锁定?

非事务性表通过表锁定,来实现类似于事务处理的效果,(表读锁,表写锁,实际上mysql内部有多达十几种的表的锁定的方式)如:

lock table software read,branches write; -- 同时对software表加 read锁 branches表加 write锁

lock table software read;

-- 表读锁:这个线程 或者 这个session 可以对该表进行读,其他的一些线程也可以读。但是不管那些session或者线程对它写;

select * from software;

insert into software (sid,version) values (6,6);

use jikedb;

非事务性表读锁比如如下实例:

1)mysql连接会话一 :演示表读锁

mysql> lock table software read;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from software;

+------+---------+

| sid | version |

+------+---------+

| 1 | 1 |

| 2 | 2 |

| 3 | 3 |

| 4 | 4 |

| 5 | 5 |

+------+---------+

5 rows in set (0.00 sec)

mysql> insert into software (sid,version) values (6,6);

ERROR 1099 (HY000): Table 'software' was locked with a READ lock and can't be updated

mysql> update software set version = 55 where sid =5;

ERROR 1099 (HY000): Table 'software' was locked with a READ lock and can't be updated

mysql>

此时mysql会话一的线程,在software表增加了 read读锁,可以用select查看该表的,但是不可以insert into 或者uptate操作的

2)再打开mysql连接会话二:

mysql> select * from software;

+------+---------+

| sid | version |

+------+---------+

| 1 | 1 |

| 2 | 2 |

| 3 | 3 |

| 4 | 4 |

| 5 | 5 |

+------+---------+

5 rows in set (0.03 sec)

mysql> insert into software (sid,version) values (6,6);

^C^C -- query aborted

ERROR 1317 (70100): Query execution was interrupted

mysql> update software set version = 55 where sid = 5;

^C^C -- query aborted

ERROR 1317 (70100): Query execution was interrupted

mysql>

此时mysql会话二的线程,在software表可以执行select查询操作,但不可以insert into 或者  uptate操作的,那怎么样才能继续添加或者更新记录到software?如下3)

3)mysql连接会话一

unlock tables;

这样software被mysql连接会话一解锁了,此时mysql连接会话一或者mysql连接会话二就可以实现software表的更新与添加了!

写锁:当前的线程既可以读也可以写,但是其他的线程既不可以读,也不可以写如下实例:打开两个mysql会话一 mysql会话二,mysql会话一write锁住software,mysql一既可以读software;mysql会话二 既不可以读software,也不可以写software;

1)mysql会话一:

mysql> lock table software write;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from software;

+------+---------+

| sid | version |

+------+---------+

| 1 | 1 |

| 2 | 2 |

| 3 | 3 |

| 4 | 4 |

| 5 | 555 |

+------+---------+

5 rows in set (0.00 sec)

mysql> update software set version = 55 where sid = 5;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from software;

+------+---------+

| sid | version |

+------+---------+

| 1 | 1 |

| 2 | 2 |

| 3 | 3 |

| 4 | 4 |

| 5 | 55 |

+------+---------+

2)mysql会话二

mysql> select * from software;

^C^C -- query aborted

ERROR 1317 (70100): Query execution was interrupted

mysql> update software set version = 5 where sid = 5;

^C^C -- query aborted

ERROR 1317 (70100): Query execution was interrupted

3)mysql会话一,unlock tables解锁

unlock tables;

4)mysql会话二

mysql> update software set version = 5 where sid = 5;

Query OK, 1 row affected (22.95 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql>

此时mysql会话二可以读写操作software表了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值