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

2015-10-29 12:48:13 +08:00
 taofuan

比如考虑用户的注册的情况,先根据用户名判断数据库里有没有同用户名称的,如果没有的话创建用户。
请问各位,这种情形需不需要加数据库事务?并限定事务的级别。我考察了几个开源的代码发现都没有加数据库事务。下面是 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

1155 次点击
所在节点    数据库
7 条回复
oott123
2015-10-29 13:17:07 +08:00
如果你的用户名有唯一索引,那就不用,反正插也插不进去。
domty
2015-10-29 13:30:19 +08:00
这样不用,我都是在进行 insert , updata , delete 总计超过两次以上,为了保证一致性才开事务的。
你这个查出来有重合就不执行插入了,要事务没啥意义。
taofuan
2015-10-29 13:41:47 +08:00
@domty 是吗? 我是这么想的就像 2 个线程一样 线程 1 查询某用户名没有,线程 2 这时候插入了同用户名的用户,然后线程 1 开始插入, 所以我寻思开个事务保证一下
mulog
2015-10-29 14:07:55 +08:00
@taofuan
线程 1 插就插啊反正又插不进去
当然你用户名如果不是 unique 就当我没说。。
domty
2015-10-29 14:25:32 +08:00
@taofuan
没有任何关系,你把数据库当成一个整体看。第一次问他有没有和你手头的数据重合的数据,有就中止后面的插入操作了。如果你的数据库里执行插入的那张表有用户名唯一约束的话都不用查是否重合,直接插入等数据库的返回信息就行了。
你的这个过程应该是一个线程从头走到尾的,至于数据库内是如何执行的你的 sql 你不需要考虑。
moro
2015-10-29 14:32:01 +08:00
需要的
所有从数据库中取出数据进行判断来修改或者插入数据,都是需要保证数据一致性的。
moro
2015-10-29 14:32:43 +08:00
如果使用插入判断,就不需要的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/231972

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX