在MySQL数据库中存在一张settings表:
sname | svalue |
---|---|
no | 0 |
no2 | 0 |
同时存在以下两个函数:
CREATE FUNCTION `fn_inc_no`() RETURNS int(11)
BEGIN
DECLARE val INT DEFAULT 0;
UPDATE settings
SET svalue = svalue + 1
WHERE sname = 'no';
SELECT svalue INTO val FROM settings WHERE sname = 'no';
RETURN val;
END
和
CREATE FUNCTION `fn_inc_no2`() RETURNS int(11)
BEGIN
DECLARE val INT DEFAULT 0;
UPDATE settings
SET svalue = svalue + 1
WHERE sname = 'no2';
SELECT svalue INTO val FROM settings WHERE sname = 'no2';
RETURN val;
END
如果此时在Java程序中运行如下代码:
Statement query = conn.createStatement();
ResultSet rs = query.executeQuery("SELECT fn_inc_no() AS no, fn_inc_no2() AS no2");
在多个线程(测试时使用了10个线程)中多次(测试时重复执行10000次)执行以上代码,最后得到的 no 和 no2 总是相等的。这是否说明了这条SELECT语句当中的fn_inc_no和fn_inc_no2总是在同一个事务中执行的,是否说明此条SELECT语句在MySQL中本身是一个原子操作?