数据库事务

事务特性

  • 原子性
  • 一致性:事务执行前后 数据都出于一致性状态
    • 逻辑正确,转账、消费等业务
    • 相同数据在多个位置 值一致
  • 隔离性
  • 持久性

事务隔离级别==>决定锁的策略和粒度

  1. 读未提交(Read uncommitted)。

    写操作加写锁,读操作不加锁。可防止丢失更新。

2.读已提交(Read committed)。

写操作加写锁,读操作加读锁。防止脏读。这是大部分关系数据库的默认 隔离级别。

3.可重复读(Read repeatable)。

对于读操作加读锁到事务结束,其他事务的更新操作只能等到事务结束之后进行。不禁insert和delete,引起幻读

4.序列化(Serializable)。

读操作加表级读锁至事务结束。可以禁止幻读。

数据库锁

策略

  • 共享锁:允许多个持有,一般用来读
  • 排他锁
  • 更新锁:即将转化为排他锁,先读后更新,防止死锁
  • 意向锁 (在更粗的锁粒度上 标记锁占用)

粒度

  • 行rowlock
  • 页pagelock
  • 表tablelock

悲观锁&乐观锁

  • 悲观锁:利用数据库本身的锁机制实现。
    通过上面对数据库锁的了解,可以根据具体业务情况综合使用事务隔离级别与合理的手工指定锁的方式比如降低锁的粒度等减少并发等待。
  • 乐观锁:CAS策略。方式大概有以下3种
    • 对记录加版本号.
    • 对记录加时间戳.
    • 对将要更新的数据进行提前读取、事后对比。