V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
taofuan
V2EX  ›  数据库

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

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

    比如考虑用户的注册的情况,先根据用户名判断数据库里有没有同用户名称的,如果没有的话创建用户。
    请问各位,这种情形需不需要加数据库事务?并限定事务的级别。我考察了几个开源的代码发现都没有加数据库事务。下面是 reddit 的代码:
    def register(name, password, registration_ip):
       try:
         a = Account._by_name(name)
         raise 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   ·   实用小工具   ·   3547 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:38 · PVG 12:38 · LAX 20:38 · JFK 23:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.