1

关于 MySQL 中 SELECT 语句的原子性问题

 2 years ago
source link: https://www.oschina.net/question/255670_2323603
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

关于 MySQL 中 SELECT 语句的原子性问题

乌小涂 发布于 08/19 11:12
阅读 301

在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 DEFINER=`root`@`localhost` 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中本身是一个原子操作?


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK