1.数据库回滚(rollback)和撤销(undo)的区别
答:回滚:即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,滚回到事务开始时的状态。
撤销:恢复程序要在不影响其他事务运行的情况下,强行回滚该事务,即撤销该事务已经做出的任何对数据库的修改,使得该事务好像根本没有启动一样。
二者主要区别在于事务执行的状态,回滚是在事务未全部完成即在事务中发生的,撤销是在该事务已经执行完成后发生的,不过二者都是为解决事务故障而存在的一种安全机制。
2.数据库事务
答:database transaction,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。
原子性:atomic,事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性:consistent,
隔离性:insulation,由并发事务所作的修改必须与其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
持久性:duration,
3.数据库中如何确保添加时某列数据不会重复
为该列添加索引或设置主键。
4.
不要使用count(列名)或count(常量)来替代count(*);count(*)会统计值为null的行,而count(列名)不会统计此列为null值得行。
5.
使用isnull()来判断是否为null值。注意:null与任何值得直接比较都为null。
6.分层领域模型规约
POJO(plain ordinary java object):在本手册中,POJO专指只有setter/getter/toString的简单类。
DO(Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。
DTO(Data Transfer Object):数据传输对象,Service和Manager向外传输的对象。
BO(Business Object):业务对象,可以由Service层输出的封装业务逻辑的对象。
Query:数据查询对象,各层接收上层的查询请求。
VO(View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。
ORM(object relation mapping):对象关系映射。
7.如果明确知道只有一条结果返回,limit 1能够提高效率
select * from user where name = ?
可优化为:
select * from user where name = ? limit 1
原因:你知道只有一条结果,但数据库并不知道,明确告诉它,让它主动停止游标移动
8.把计算放到业务层而不是数据库层,除了节省数据的CPU,还有意想不到的查询缓存优化效果
select * from order where date <= CURDATE()
这不是一个好的SQL实践,应该优化为:
$curDate = date('Y-m-d');
$res = mysql_query(
'select * from order where date < = $curDate');
原因:
释放了数据库的CPU;
多次调用,传入的SQL相同,才可以利用查询缓存