DevExperience(1712)
【1】在 DML 或 DDL 语句中,不要添加 数据库表前缀: 因为开发环境的数据库表名 和 生产环境的数据库表名 有可能不一样; 这个时候就有可能报 SQL 异常;造成生产事故;
不推荐: select * from db_name.tbl_name where ....
推荐: select * from tbl_name
当然了,也有可能开发环境的数据库表名 与 ST测试环境 或 UAT测试环境的 数据库表名 不一致;但这种错误都是可以在 测试阶段测试出来的。但是一旦项目上了生产环境,你就不能改了。
【2】对于开启数据库事务的操作: 特别要注意事务回滚。
设想这样一个场景: 有个班级表 class_tbl, 学生表 stu_tbl, 班级表有字段 学生数量 stu_num; 当执行删除学生操作时,要级联更新班级的学生数量 stu_num,其中通过学生来查询需要更新的班级。
方法1)先执行删除学生操作, 然后通过学生(多)查询班级(一)并更新班级的 学生数量: 这个时候,更新操作不会成功,因为更新时 需要通过学生来查询需要更新哪个班级,但是学生记录又被您先删除了,所以更新失败。。这个时候,更新失败,事务回滚,被删除的学生又恢复了(没有删除)。。
所以这个时候就有一个奇怪的现象: 数据库当中明明有 这个学生记录(事务回滚后,该学生从删除状态恢复到在库状态),那为什么无法通过该学生 去级联更新班级的学生数量呢 ?? 那是因为你更新操作前,先在同一个事务中删除了这个学生,所以这个学生是不存在的,无法执行级联更新。。然后事务回滚,学生在数据库中又没有被删除。。。。然后你就陷入了 泥潭,久久无法自拔啊。。。
方法2)先通过学生(多)查询班级(一)并更新班级的 学生数量,再 执行删除学生操作(推荐): 这种方法的更新班级的学生数量 和 删除 学生记录 的方法是比较好的,不会出现方法1那种 奇怪的情况;
【总结】有减必有加,所以当你 新增学生的时候,同样的道理: 就要先执行更新学生数量操作,然后再执行新增学生操作;因为上述两个操作都在同一个事务中,一旦发生异常,事务回滚,数据库保持操作前后的数据一致性;
【3】关于数据分表权限拆分
1) 以四川省内的地级市 和 县级市为荔枝: 首先数据库表通过 地级市来分表,每个地级市一张表,如成都市的数据库表后缀suffix都是028,达州市的数据库表后缀是 0818;
每个表有字段 行政市id city_id 字段 用于存储市编号,如 tbl_*_028 的 city_id=028;
2)设想这样一种场景:因为成都天府国际机场修在简阳市,所以作为县级市的简阳市,其所有数据都挂在了 成都028的数据库表上,但通过 city_id=1214(假设简阳的区号是1214)来标识它是简阳的数据;
3)数据权限拆分需求: 地级市的用户可以查看 地级市 和 旗下所有县级市的数据,而县级市只能查看自己的县级市的数据,不能查看其它县级市的数据:
只需要通过比较 数据库表后缀suffix 与 city_id 是否相等来判断:
若两者相等,则表示地级市;
若两者不相等,则表示县级市;
【注意】上述数据权限拆分策略非常简单,只需要使用 mybatis 的 if 标签来判断就可以了;
【4】
DevExperience(1712)相关推荐
- DevExperience(1710)
[1]Date 和 String 互转 // Date 和 String 互转.public static void main(String[] args) {SimpleDateFormat for ...
- 前端学习(1712):前端系列javascript之创建uni-app创建下
- 干货 | 目标检测入门,看这篇就够了(下)
作者 | 李家丞( 同济大学数学系本科在读,现格灵深瞳算法部实习生) 近年来,深度学习模型逐渐取代传统机器视觉方法而成为目标检测领域的主流算法,本系列文章将回顾早期的经典工作,并对较新的趋势做一个全景 ...
- JVM运行时数据区---方法区(内部结构)
方法区的内部结构 方法区的演变和垃圾回收 方法区存储什么? <深入理解Java虚拟机>书中对方法区(Method Area)存储内容描述如下:它用于存储已被虚拟机加载的类型信息.常量.静态 ...
- 12.1 LNMP架构介绍;12.2 MySQL安装;12.3-2.4 PHP安装(上下);12.5
扩展: Nginx为什么比Apache Httpd高效:原理篇 http://www.toxingwang.com/linux-unix/linux-basic/1712.html apache和ng ...
- shell 学习笔记(18)
2019独角兽企业重金招聘Python工程师标准>>> 声明:转载需署名出处,严禁用于商业用途! 1701.大量连接处于 TIME_WAIT 状态的解决方法:netstat -nt ...
- python 使用sort()函数和正则表达式(lambda)对os.listdir()获取的文件夹文件列表进行重新排序 乱序排序
# 排序函数,对文件列表进行排序 # 排序函数,对文件列表进行排序(filenames为文件夹文件的文件名的字符串列表) def sort_filenames(filenames):# (1)可以以l ...
- 基于深度学习的目标检测算法综述(一)
基于深度学习的目标检测算法综述(一) 基于深度学习的目标检测算法综述(二) 基于深度学习的目标检测算法综述(三) 本文内容原创,作者:美图云视觉技术部 检测团队,转载请注明出处 目标检测(Object ...
- (转)开源 Apache 服务器安全防护技术精要及实战
2019独角兽企业重金招聘Python工程师标准>>> Apache 一直是世界上使用率排名前三的 Web 服务器软件.企业使用其构建 Web 应用,从很大程度上都需要对其安全性进行 ...
最新文章
- mysql分区字段创建索引_MySQL分区字段列有必要再单独建索引吗?
- Tomcat启动报错 Could not reserve enough space for object heap
- Recover it!
- 《Linux内核分析》课程总结
- 搭建mysql集群,使用Percona XtraDB Cluster搭建
- 计算机组成原理哈工大期末_浅谈计算机组成原理(三)
- qtwebengineprocess已停止工作_windows资源管理器总是停止工作
- Linux解压tar.gz、zip、tar.bz2 文件与对应的命令
- Squid优化完全手册(2)
- win7查看tomcat端口_想研究Tomcat性能调优,看这篇就够了
- 另一个进程已被死锁在资源上且该事务已被选作死锁牺牲品
- mysql 按指定值排序
- C语言知识点笔记完全整理
- 现在谁还会LOL钻石网吧特权?
- pyserial安装失败
- 计算机专业的学生也太太太太太惨了吧?
- 360快捷方式右上角的软件更新图标实现
- I5 4590 台式机安装黑苹果最新版笔记
- 董明珠:没有人才,一切归零;没有道德,人才归零
- 新手如何看k线(图)