笔记04-数据库事务、锁

  • 事务
    事务是一条或多条sql语句组成的 ,这些sql语句要么都执行,要么都不执行。针对所有数据库,关系型数据库和非关系型数据库。
  • 涉及到的语法:
    1.show variables like 'autocommit’查询是否自动提交
    2.set autocommit = 0; 设置为手动提交(提交的意思是永久保存)
    3.select global|session transaction ioslation level read uncommitted|read commited|repeatable read|serializion设置隔离级别
    4.select @@tx_isolation 查看隔离级别
    5.rollback 回滚
    6.savepoint 保存点,如果回到最初的保存点,其中间的所有子保存点则取消。
  • 特点
    原子性:一个事务是最小执行单位,不可在分成多个部分,也就是说事务在执行时,不可以过半终止。所以说要么不执行,要么都执行。
    一致性:事务开始到任务结束,数据的状态要保持一致。
    1.当前表中有两条数据,这两条数据在一个事务中,那么这两条数据的状态要一致
    2.主表和从表,假设主表的主键更新了,那你从表的外键字段也必须更新
    隔离性:体现在并发情况下的,一个事务操作一条数据时其他事务不可以访问这条记录,没有隔离级别的话,在并发情况下读取数据时就会出项一下情况:
    1.脏读:假设T1和T2两个事务,此时T1修改了数据库表中的一条数据但是没提交,然后T2读取了当前修改后的记录,这时T1回滚了,这是T2读取的数据和数据库表中的数据不一致。
    2.不可重复读:假设T1和T2两个事务,T1不断的读取当前表中的某条记录,在读取过程中T2对当前记录进行了修改操作,并且提交了。这时候T1在一个事务中读取的数据不一致了。
    3.幻读:T1和T2两个事务,当T1查询工资为5000的员工数是10,T2inner into操作,总记录数为11,T1和T2总记录数不一致,就是幻读
    持久性:如果事务执行commit提交操作,那么多数据库永久保存,不可回滚
  • 隔离级别
    1.读未提交数据(read uncommitted):会出现脏读、不可重复度、幻读
    2.读已提交数据(read committed):会出现不可重复读、幻读 Oracle默认
    3.可重复读(repeatable read):幻读 MySQL默认
    4.串行化(serialization):都不会出现,但是性能比较慢
  • 解决并发问题
    1.事务隔离级别
    2.悲观锁
    关键字:for update
    演示悲观锁时要修改隔离级别,设置手动提交数据。只可以在查询后边带有关键字。
    5.5版本之前myISAM表锁, myISAM 不支持事务
    现在 INNODB行锁、表锁,INNODB 支持事务
    3.乐观锁:版本号和时间戳来判断是否出现并发问题。可以理解为在表上加一个字段。
    在并发情况下,没有事务隔离级别时候T1和T2两个事件去查询修改时,T1进入锁的时候标记时间戳为,执行完毕后,标记的时间戳是否和刚进入时的时间是否相等,如果相等意味着T2事件没有修改,将最后的时间定为现在的时间戳。下次在以该时间戳做标记。如果时间戳不和刚刚标记的时间戳相等,意味着在你保存之前T2修改过(如果T1在保存,数据库就乱了),直接放弃之前所有操作重新开始。这样可以让其不同时修改,只能一个一个修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值