/ 中存储网

MySQL服务器的更新顺序

2014-07-13 16:30:14 来源:中存储网
首先认为,在同一个事务里更新多条记录,mysql执行顺序和binlog的生成顺序一致
java代码中调用jdbc如下次序更新数据库,
Tx.begin
SQL1
SQL2
SQL3
Tx.end
那么生成的binlog还是SQL1、SQL2、SQL3执行顺序
但是在含有case when update语句中,生成的binlog顺序和,不是按照语句中从左到右的顺序的
  Connection con = DriverManager.getConnection(url, user, password);
        Statement stmt = con.createStatement();
        con.setAutoCommit(false);
        String st = "UPDATE `jw_user` SET `nick_name` = 1WHEN id = 6 THEN 1WHEN id = 5 THEN 1WHEN id = 4 THEN 1592 END";
        stmt.execute(st);
        con.commit();
操作结果,id为 4,5,6的对应的nick_name字段均改为1,但是id为7的nick_name对应的值从0改为null,这个原因要再查下?

binlog内容
13600996 BEGIN
13600997 /*!*/;
13600998 # at 322956114
13600999 # at 322956166
13601000 #130626 18:40:57 server id 110  end_log_pos 322956166   Table_map: `jingwei`.`jw_user` mapped to number 6526373
13601001 #130626 18:40:57 server id 110  end_log_pos 322956291   Update_rows: table id 6526373 flags: STMT_END_F
13601002 ### UPDATE jingwei.jw_user
13601003 ### WHERE
13601004 ###   @1=4
13601005 ###   @2='1592'
13601006 ### SET
13601007 ###   @1=4
13601008 ###   @2='1'
13601009 ### UPDATE jingwei.jw_user
13601010 ### WHERE
13601011 ###   @1=5
13601012 ###   @2='4925'
13601013 ### SET
13601014 ###   @1=5
13601015 ###   @2='1'
13601016 ### UPDATE jingwei.jw_user
13601017 ### WHERE
13601018 ###   @1=6
13601019 ###   @2='2952'
13601020 ### SET
13601021 ###   @1=6
13601022 ###   @2='1'
13601023 ### UPDATE jingwei.jw_user
13601024 ### WHERE
13601025 ###   @1=7
13601026 ###   @2='0'
13601027 ### SET
13601028 ###   @1=7
13601029 ###   @2=NULL
13601030 # at 322956291
13601031 #130626 18:40:57 server id 110  end_log_pos 322956318   Xid = 2073115838
13601032 COMMIT/*!*/;
发现mysql内部(innodb)执行更新的顺序是按照主键的升序进行的,而不是sql语句字面顺序,先执行id等于6的,再执行id等于5的,最后执行id等于4的