第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

[Mysql] Select 不到,Insert出錯的問題,字段編碼問題

[Mysql] Select 不到,Insert出錯的問題,字段編碼問題

胡說叔叔 2019-04-07 09:38:32
Mysql5.5表結(jié)構(gòu)為:CREATETABLE`account`(`name`varchar(20)NOTNULL,PRIMARYKEY(`name`))ENGINE=InnoDBDEFAULTCHARSET=gbk;name字段目前的編碼:CharacterSet:gbkCollation:gbk_chinese_ci目前我的程序邏輯為:首先:select*from`account`where`name`=?如果返回空,則插入該name:insertinto`account`(`name`)values(?)現(xiàn)在在我后臺有幾個報錯記錄:com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException:Duplicateentry'?§ˉ???'forkey'PRIMARY'(請忽略name為亂碼,這可能是我輸出記錄文本導(dǎo)致的)我的問題是,為什么我明明先select了該name,沒有我才會insert,還會導(dǎo)致這個異常?這是否跟我設(shè)置了name字段為gbk編碼有關(guān)?有沒相關(guān)參考文章可以提供給我看下?應(yīng)該將該字段編碼設(shè)置為什么來避免這個問題?BTW:使用ignore參數(shù)當(dāng)然可以忽略該異常,但我主要想知道為什么之前select無法獲取,Insert卻出錯
查看完整描述

2 回答

?
MYYA

TA貢獻(xiàn)1868條經(jīng)驗 獲得超4個贊

字符編碼問題請高人來解答。
我只說點(diǎn)別的。
在高并發(fā)的情況下,你這兩次操作的結(jié)果是不確定的,是不安全的。
使用如下的原子操作更安全一些。
INSERTINTO`table`(`id`,`name`)VALUES(?,?)ONDUPLICATEKEYUPDATE`name`=VALUES(`name`);
或者
INSERTIGNOREINTO`table`(`id`,`name`)VALUES(?,?)
                            
查看完整回答
反對 回復(fù) 2019-04-07
?
12345678_0001

TA貢獻(xiàn)1802條經(jīng)驗 獲得超5個贊

個人認(rèn)為這應(yīng)該不是編碼問題,而是象@HJin.me所說,是一個并發(fā)問題.即session1在select得到emptyset后;session2去insert了一個相同的name;此時session1去insert,則得到duplicated.
mysql事務(wù)默認(rèn)的隔離級別是repeatedread,不會防止上面的情況,實(shí)驗一把.
session1:starttransaction;
session2:starttransaction;
session1:select*fromaccountwherename='11';//emptyset
session2:insertintoaccountvalues('11');
session2:commit;
session1:insertintoaccountvalues('11');//duplicatekey
                            
查看完整回答
反對 回復(fù) 2019-04-07
  • 2 回答
  • 0 關(guān)注
  • 401 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號