防止sql注入,对特殊字符进行过滤、转义或者使用预编译的sql语句绑定变量程序员
当sql语句运行报错时,不要把数据库返回的错误信息所有显示给用户,以防止泄露服务器和数据库相关信息sql
若是sql语句在拼接的状况下,使得查询永远成立,如拼接上 or '1'='1',会发生不安全问题数据库
解决办法:安全
参数绑定:不拼接字符串,使用preparedStatement,参数使用set方法进行填装服务器
检查变量的数据类型:如sql语句相似where id={$id},数据库中全部的id都是数字,那么在执行sql语句前,要保证ID是int类型网络
全部的sql语句都封装在存储过程当中并发
一些编译好的sql语句,这些sql语句代码向一个方法同样实现一些功能,而后再给这些代码块取一个名字,在用到这个功能的时候调用它便可。模块化
优势spa
存储过程由于SQL 语句已经预编译过了,所以运行的速度比较快。设计
存储过程在服务器端运行,减小客户端的压力。
容许模块化程序设计,就是说只须要建立一次过程,之后在程序中就能够调用该过程任意次,相似方法的复用。
减小网络流量,客户端调用存储过程只须要传存储过程名和相关参数便可,与传输SQL 语句相比天然数据量少了不少。
加强了使用的安全性,充分利用系统管理员能够对执行的某一个存储过程进行权限限制,从而可以实现对某些数据访问的限制,避免非受权用户对数据的访问,保证数据的安全。程序员直接调用存储过程,根本不知道表结构是什么,有什么字段,没有直接暴露表名以及字段名给程序员。
内链接,外链接(左外链接(是内链接的下一阶段)、有外链接、全外链接)
事务是由一组sql语句组成的逻辑处理单元。用户定义的一个数据库操做序列,是数据恢复和并发控制的基本单位。
原子性:一个事务中的全部操做,要么所有完成,要么所有不完成,不会结束在中间某个环节。事务在执行过程当中发生错误,会被回滚到事务开始前的状态。
一致性:在事务开始和完成时,数据库中的数据都保持一致的状态,数据的完整性约束没有被破坏。(事务的执行使得数据库从一种正确状态转换成另外一种正确状态)
隔离性:一个事务的执行不能被其余事务干扰。为了防止事务操做间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。隔离性经过锁就能够实现。
持久性:一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,并不会被回滚。
更新丢失:两个事务Tl 和T2 对同一数据读写,T2 提交的结果覆盖了Tl 提交的结果,致使Tl 的修改被丢失。
脏读:事务1读取到事务2未提交的数据
不可重复读:是指在一个事务内,屡次读同一数据。在这个事务尚未结束时,另一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,因为第二个事务的修改,那么第一个事务两次读到的的数据多是不同的----------------------修改
虚读、幻读:屡次读出来的记录数不同------------增长/删除
加锁
read uncommited:容许事务读取未被其余事务提交的变动
read commited:容许事务读取已经被其余事务提交的变动,能够避免脏读,可能有不可重复读和幻读的问题。
repeatable read:确保事务能够屡次从一个字段中读取相同的值,在这个事务持续期间,禁止其余事务对这个字段进行更新,能够避免脏读和不可重复读,可能会有幻读。
可串行化
数据库保证数据的一致性的方法:事务、悲观锁、乐观锁
锁是一种并发控制技术,锁用来在多用户同时访问同一个数据的时候保护数据的
共享(S)锁:多个事务可封锁一个共享页,任何事务都不能修改该页.一般是该页被读取完毕,S 锁当即被释放。在执行select 语句的时候须要给操做对象加上共享锁,但加锁以前须要检查是否有排他锁,若是没有,则能够加共享锁(一个对象上能够加n 个共享锁),不然不能加。共享锁一般在执行完select 语句以后被释放,也有多是在事务结束(包括正常结束和异常结束)的时候被释放,主要取决与数据库所设置的事务隔离级别。
排它(X)锁:仅容许一个事务封锁此页;其余任何事务必须等到X 锁被释放才能对该页进行访问;X 锁一直到事务结束才能被释放。执行insert、update、delete 语句的时候须要给操做的对象加排他锁,在加排他锁以前必须确认该对象上没有其余任何锁,一旦加上排他锁以后,就不能再给这个对象加其余任何锁。排他锁的释放一般是在事务结束的时候,可是数据库事务隔离级别被设置成Read Uncommitted的时候,这种状况下排他锁会在执行完更新操做以后就释放
互斥条件:一个资源每次只能被一个进程使用。
请求与保持条件:一个进程因请求资源而阻塞时,对已得到的资源保持不放。
不可剥夺条件:进程已得到的资源,在末使用完以前,不能强行剥夺。
环路等待条件:若干进程之间造成一种头尾相接的循环等待资源关系。