- 论坛徽章:
- 0
|
楼主的问题,可以用锁表的办法来解决。当一个SESSION进行的查询插入的时候,锁定表,加写锁。这样其他SESSION不能写入。
下面开始测试。
1:创建一个存储过程,实现自增字段。
- create procedure sp1()
- begin
- declare A int;
- select max(id) into A from test;
- insert into test values(if(A<=>null,0,A)+1,concat('a',if(A<=>null,0,A)));
- end ;
复制代码 2:打开一个连接,先锁定test 表,再进行call sp1();
mysql> lock table test write;
Query OK, 0 rows affected (0.00 sec)
mysql> call sp1();
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+----+------+
| id | name |
+----+------+
| 1 | a0 |
+----+------+
1 row in set (0.00 sec)
这时候不解锁,看另外一个连接
3:另外一个连接进行插入操作
mysql> call sp1();
由于表被锁,等待表释放。。
(如果不锁表的话,此条记录的ID=2)
4:在第一个连接里再插入一条
mysql> call sp1();
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+----+------+
| id | name |
+----+------+
| 1 | a0 |
| 2 | a1 |
+----+------+
2 rows in set (0.00 sec)
插入成功,ID是2.
5:释放锁定。
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
6:释放锁的同时,3的操作成功。
mysql> call sp1();
Query OK, 1 row affected (16.17 sec)
等待了16.17秒。
再来查3操作后,写入的是否是2
mysql> select * from test;
+----+------+
| id | name |
+----+------+
| 1 | a0 |
| 2 | a1 |
| 3 | a2 |
+----+------+
3 rows in set (0.00 sec)
ID=3.
测试成功。
在程序调用的时候,CALL SP1前加lock table test write;执行后加UNLOCK TABLES; |
|