Mysql 5.5 表结构为:
name 字段目前的编码:
`CharacterSet:gbk
Collation:gbk_chinese_ci`
目前我的程序逻辑为:
首先:
select * from
account where
name=?
如果返回空,则插入该name:
insert into
account (
name) values(?)
现在在我后台有几个报错记录:
(请忽略name为乱码,这可能是我输出记录文本导致的)
我的问题是,为什么我明明先select了该name,没有我才会insert,还会导致这个异常?
这是否跟我设置了name字段为gbk编码有关?有没相关参考文章可以提供给我看下?
应该将该字段编码设置为什么来避免这个问题?
BTW:使用ignore参数当然可以忽略该异常,但我主要想知道为什么之前select无法获取,Insert却出错
个人认为这应该不是编码问题, 而是象 @HJin.me 所说, 是一个并发问题. 即session1 在select 得到empty set后; session2 去insert了一个相同的name; 此时session1去 insert, 则得到 duplicated.
mysql事务默认的隔离级别是repeated read, 不会防止上面的情况, 实验一把.
session1: start transaction;
session2: start transaction;
session1: select * from account where name='11'; //empty set
session2: insert into account values('11');
session2: commit;
session1: insert into account values('11'); // duplicate key
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。