mysql知识点
Posted q-1993
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql知识点相关的知识,希望对你有一定的参考价值。
sql语句应该考虑哪些安全性问题
-
防止sql注入,对特殊字符进行过滤、转义或者使用预编译的sql语句绑定变量
-
当sql语句运行报错时,不要把数据库返回的错误信息全部显示给用户,以防止泄露服务器和数据库相关信息
sql注入
如果sql语句在拼接的情况下,使得查询永远成立,如拼接上 or ‘1‘=‘1‘,会发生不安全问题
解决办法:
-
参数绑定:不拼接字符串,使用preparedStatement,参数使用set方法进行填装
-
检查变量的数据类型:如sql语句类似where id=$id,数据库中所有的id都是数字,那么在执行sql语句前,要保证ID是int类型
-
所有的sql语句都封装在存储过程中
存储过程
一些编译好的sql语句,这些sql语句代码向一个方法一样实现一些功能,然后再给这些代码块取一个名字,在用到这个功能的时候调用它即可。
优点
-
存储过程因为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的时候,这种情况下排他锁会在执行完更新操作之后就释放
产生死锁的必要条件(缺一都不会发生死锁)
-
互斥条件:一个资源每次只能被一个进程使用。
-
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
-
不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
-
环路等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
-
以上是关于mysql知识点的主要内容,如果未能解决你的问题,请参考以下文章