MySQL存储过程和事务
文章来自 shichang // Welcome!
主页
|
About Me
|
归档
|
标签
### 存储过程 存储过程是Mysql自带的一种执行事务的规范,是Mysql自带的编程语言。书写一组特定的sql语句,集中编译后存储在数据库中,用户通过指定存储过程的名称并给出参数执行事务。 存储过程分为系统提供的存储过程和用户自定义的存储过程 使用存储过程的好处: * 存储过程定以后可以重复使用 * 存储过程只在创建时进行一次编译,后续可以直接使用 * 存储过程存储在MySQL服务器上,在进行工作时,应用服务器只需要将参数传递到数据库服务器,不需要将整个sql都传输过来 * 参数化的存储过程可以防止SQL注入攻击 ### 事务 事务指的是一连串的特定的SQL语句的正确执行。Mysql中InnoDB引擎支持事务,事务的隔离级别为可重复读,避免了不可重复读和脏读。 关系型数据库事务的特性ACID原则: * Atomicity:原子性,事务中的所有语句要么全部成功执行,其中一个失败则整个事务失败,进行回滚。 * Consistency:一致性,数据库在执行事务前如果有完整性约束,那么在执行事务后完整性约束不变。 * Isolution:独立性,并发的事物之间不会互相影响,InnoDB引擎针对并发条件下的事务执行提供了4种隔离级别 * Durability:持久性,事务提交后,事务所进行的修改也会永久的更改在数据库的数据中。 ### 完整性约束 在关系型数据库中存在完整性约束,包括: * 域完整性:指给定列的取值范围,Mysql中有通过指定数据类型,格式,外键取值,DEFAULT取值,NOT NULL约束等域完整性约束 * 实体完整性:指在表中使用主键来唯一标志一个实体,必须确保实体之间的可区分性。实体完整性强制表必须先保证标识符列和主键的完整性,MySQL中,通过索引、UNIQUE约束、PRIMARY KEY约束和IDENTITY属性。 * 引用完整性:主键与外键之间的引用规则,确保键值在所有表中一致。在主表中插入一条记录,首先这条记录外键值必须在副表中存在,在附表中删除一条记录,则主表中对应外键值的记录也必须被删除 * 用户定义完整性:用户自定义的特定业务规则,比如CREATE TBALE中所有的列级和表级约束、存储过程和触发器 ### MySQL约束条件 * 主键约束:主键的值唯一且不能为空 * 唯一性约束:声明为Unique的字段值在每条记录中都是唯一的,允许为空,但只能有一个空值 * 非空约束:声明为NOT NULL的字段值不能为空,为空会引起系统报错 * 外键约束:Foreign Key必须是另一个表中的主键,外键可以为空值,当不为空值时每一个值都必须对应另一个表中的一个唯一主键值。 ### InnoDB事务隔离级别 MySQL中有两种引擎支持事务:InnoDB和BDB。 事务的隔离级别如下: * 读未提交:并发的事务在任何时候都能够读取到其他事务中的值,事务不进行任何加锁安全措施,可能发生脏读,不可重复读,幻读等各种恶性情况 * 读已提交:只有当一个事务提交了之后,其他的并发事务才能看到这个事务对数据的修改。这样避免了脏读,但是仍然是不可重复读且有可能会发生幻读的。 * 可重复读:底层使用MVCC多版本并发控制实现,InnoDB为每一条记录添加一个版本号,当修改数据时,版本号加1。当开启一个新的事务时,系统会给这个事务一个当前版本号,这个事务只能读取到*<=*当前版本号的数据。这样就算其他事务对数据进行了更新也不会影响到以前的版本。这样就解决了不能够重复读取的问题,但是 * 串行化:事务全部按照顺序执行,其他的事务全部阻塞。读加共享锁,写加排它锁。避免了所有的数据问题,但是高并发下效率非常低 `脏读`指的是,一个事务修改了数据但是最后没有提交回滚了,另一个事务却读到了这个被修改的数据。 `不可重复读`指,的是事务开始后如果开始时和结束时对同一数据的读取结果应该是一致的,不管事务执行中途是否有其他的事务进行了这个数据的修改并提交。不可重复读一般针对的是update和delete操作。主要是针对原本数据库中已经存在的记录 `幻读`指的是,事务在执行期间执行查询,如果其他事务进行了插入新数据的操作并提交了,那么这个事务是能够读取到其他事务插入的这个新数据的,这可能会对事务的处理造成一些影响。幻读主要针对insert操作和新数据。 InnoDB默认的事务隔离级别RR,由MVCC多版本并发控制实现,MVCC是基于乐观锁的多版本系统,通过新旧版本进行更新和隔离以及回滚。MVCC的做法是在每一条记录后都加上一个版本号,当这个数据发生修改时,就将这个版本号加1,这样就保证了重复读取和select读操作不会发生幻读,InnoDB使用Next-Key锁(行锁+Gap锁)实现了当前读,保证了写操作(insert,update,delete)不会发生幻读。 ### 涉及到的一些命令 * select @@session.tx_isolation查看当前事务隔离级别 * set session transaction isolation level +后面跟上隔离级别,设置事务的隔离级别(read uncommitted, read committed, repeatable read, serializable) * begin 开启事务,commit提交事务,rollback放弃当前事务进行回滚
Pre:
Java继承和多态的原理
Next:
Java内存模型JMM