关于 MySQL 中 SELECT 语句的原子性问题
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 语句的原子性问题
在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中本身是一个原子操作?
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK