事务性数据库比非事务性数据库复杂一些。
提高性能:
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表了