这种情形需不需要加数据库事务? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
taofuan
V2EX    数据库

这种情形需不需要加数据库事务?

  •  
  •   taofuan 2015-10-29 12:48:13 +08:00 1517 次点击
    这是一个创建于 3687 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如考虑用户的注册的情况,先根据用户名判断数据库里有没有同用户名称的,如果没有的话创建用户。
    请问各位,这种情形需不需要加数据库事务?并限定事务的级别。我考察了几个开源的代码发现都没有加数据库事务。下面是 reddit 的代码:
    def register(name, password, registration_ip):
       try:
         a = Account._by_name(name)
         aise AccountExists
       except NotFound:
         a = Account(name = name,  password = bcrypt_password(password))
        # new accounts keep the profanity filter settings until opting out
         a.pref_no_profanity = True
         a.registration_ip = registration_ip
         a._commit()
         return a

    第 1 条附言    2015-10-29 15:32:04 +08:00
    -
    PS: 谢各位回复, 刚看了 reddit 确实有 name 字段的约束,看来这个问题用约束是最好的方案了,谢谢大家。
    7 条回复    2015-10-29 14:32:43 +08:00
    oott123
        1
    oott123  
       2015-10-29 13:17:07 +08:00 via Android   1
    如果你的用户名有唯一索引,那就不用,反正插也插不进去。
    domty
        2
    domty  
       2015-10-29 13:30:19 +08:00
    这样不用,我都是在进行 insert , updata , delete 总计超过两次以上,为了保证一致性才开事务的。
    你这个查出来有重合就不执行插入了,要事务没啥意义。
    taofuan
        3
    taofuan  
    OP
       2015-10-29 13:41:47 +08:00
    @domty 是吗? 我是这么想的就像 2 个线程一样 线程 1 查询某用户名没有,线程 2 这时候插入了同用户名的用户,然后线程 1 开始插入, 所以我寻思开个事务保证一下
    mulog
        4
    mulog  
       2015-10-29 14:07:55 +08:00   1
    @taofuan
    线程 1 插就插啊反正又插不进去
    当然你用户名如果不是 unique 就当我没说。。
    domty
        5
    domty  
       2015-10-29 14:25:32 +08:00   1
    @taofuan
    没有任何关系,你把数据库当成一个整体看。第一次问他有没有和你手头的数据重合的数据,有就中止后面的插入操作了。如果你的数据库里执行插入的那张表有用户名唯一约束的话都不用查是否重合,直接插入等数据库的返回信息就行了。
    你的这个过程应该是一个线程从头走到尾的,至于数据库内是如何执行的你的 sql 你不需要考虑。
    moro
        6
    moro  
       2015-10-29 14:32:01 +08:00   1
    需要的
    所有从数据库中取出数据进行判断来修改或者插入数据,都是需要保证数据一致性的。
    moro
        7
    moro  
       2015-10-29 14:32:43 +08:00
    如果使用插入判断,就不需要的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     928 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 20:28 PVG 04:28 LAX 12:28 JFK 15:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86