- 論壇徽章:
- 0
|
樓主的問題,可以用鎖表的辦法來解決。當(dāng)一個SESSION進(jìn)行的查詢插入的時候,鎖定表,加寫鎖。這樣其他SESSION不能寫入。
下面開始測試。
1:創(chuàng)建一個存儲過程,實(shí)現(xiàn)自增字段。
- 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 ;
復(fù)制代碼 2:打開一個連接,先鎖定test 表,再進(jìn)行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:另外一個連接進(jìn)行插入操作
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.
測試成功。
在程序調(diào)用的時候,CALL SP1前加lock table test write;執(zhí)行后加UNLOCK TABLES; |
|