MySQL数据库 InnoDB引擎 事务及行锁总结

1、事务

  一、事务的四大特性

    (1)原子性:事务开始后全部的操做要么一块儿成功,要么一块儿失败,整个事务是一个不可分割的总体。java

    (2)一致性:是物开始前到结束后,数据库的完整性约束没有被破坏。mysql

    (3)隔离性:同一时间只容许一个事务请求同一事务,不一样事务互不干扰。sql

    (4)持久性:事务完成,事务对数据库的全部更新将被保存到数据库,不能回滚。数据库

 

tps:数据库的完整性约束-->

数据完整性:存储在数据库中的全部数据值均正确的状态。它是应防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出形成无效操做或错误信息而提出的。

数据完整性分为四类:
1. 实体完整性(实体完整性是对关系中的记录惟一性,也就是主键的约束。准确地说,实体完整性是指关系中的主属性值不能为Null且不能有相同值。定义表中的全部行能惟一的标识,通常用主键,惟一索引 unique关键字,及identity属性好比说咱们的身份证号码,能够惟一标识一我的.。)
2. 域完整性(域完整性是对数据表中字段属性的约束,一般指数据的有效性,它包括字段的值域、字段的类型及字段的有效规则等约束,它是由肯定关系结构时所定义的字段的属性决定的。限制数据类型,缺省值,规则,约束,是否能够为空,域完整性能够确保不会输入无效的值.。)
3. 参照完整性(参照完整性是对关系数据库中创建关联关系的数据表间数据参照引用的约束,也就是对外键的约束。准确地说,参照完整性是指关系中的外键必须是另外一个关系的主键有效值,或者是NULL。参考完整性维护表间数据的有效性,完整性,一般经过创建外部键联系另外一表的主键实现,还能够用触发器来维护参考完整性)
4. 用户定义的完整性。

约束是表级的强制规定,有如下五中:not null,unique,primary key,foreign key,check 。



 

 

 

 

 

 

 

 

 

 

 

 

 

  二、事务的隔离级别

  

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read) (mysql默认)
串行化(serializable)

 

 

 

 

 

 

 

  (1)脏读:事务A读取到事务B未提交的数据(事务B回滚可怎么办)。安全

  (2)不可重复读:事务A在同一事务中屡次读取同一数据,取到不一样的值。(有其余事务在A事务期间更新了这一数据、或删除,致使)ide

  (3)幻读:事务A两次读取数据,返回的数据条数不一致(发生增长)atom

2、行锁

  一、乐观锁

    乐观锁并非数据库自己实现的,他须要咱们本身去实现。spa

 

    每次去拿数据的时候都认为别人不会修改,因此不会上锁,可是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可使用版本号等机制。乐观锁适用于多读的应用类型,这样能够提升吞吐量,像数据库提供的相似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。code

  二、悲观锁

    老是假设最坏的状况,每次去拿数据的时候都认为别人会修改,因此每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了不少这种锁机制,好比行锁,表锁等,读锁,写锁等,都是在作操做以前先上锁。再好比Java里面的同步原语synchronized关键字的实现也是悲观锁。orm

悲观锁涉及到另外两个锁概念,它们就是共享锁与排它锁。共享锁和排它锁是悲观锁的不一样的实现,它俩都属于悲观锁的范畴。

  1)共享锁:对于多个事务对同一资源共享一把锁

    在执行语句后面加上lock in share mode就表明对某些资源加上共享锁了

  2)排它锁:对于多个事务对同一资源只能有一把锁

    在执行语句后面加上for update就表明对某些资源加上排它锁了

  三、悲观锁与扫描行:

    对经过索引、主键查询到的数据加锁,会将这个索引所在的记录加上锁,若是经过条件查询,会对多条记录加上锁。

    若是不加索引,MySQL 会对扫描到的数据加锁。(不肯定)

SpringMVC @Transactional 注解

@Transactional 在方法头上注解,该方法被其余方法内部调用,则不会生效。

另须要手动开启事务用:

1       @Autowired
2     private PlatformTransactionManager transactionManager;
3 
4  DefaultTransactionDefinition def=new DefaultTransactionDefinition();
5                 def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔离级别,开启新事务,这样会比较安全些。
6                 TransactionStatus status = transactionManager.getTransaction(def); // 得到事务状态
7  transactionManager.commit(status);//提交
8  transactionManager.rollback(status);//回滚
相关文章
相关标签/搜索