目录
事务
事务就是一个过程,在这个过程中,一条语句出错就全部出错,只有全部正确才行,和它的
原子性差不多
专业术语
事务就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所
有SQL都将被取消执行。
事务的特点
一个事务中如果有一个数据库操作失败,那么整个 事务的所有数据库操作都会失败,数
据库数据就会 回滚到该事务开始之前的状态。
MySQL数据库中仅InnoDB和BDB类型的数据库表 支持事务。
事务的四大特性(ACID)
原子性(atomic):同一事务中的SQL语句是一个整体,要么全部执行成功,要么全部失败
一致性(consist):事务开始之前和事务开始之后保持数据的一致,在事务的过程中,不能保证一致性
隔离性(isolated):每个事务之间互不影响
持久性(durable):在事务结束以后,对数据的保存是永久性的
事务的并发问题
在事务并发执行的时候,如果不进行事务隔离(完全没有进行隔离的情况下),那么就会产
生脏写、脏读、不可重复读、幻读的问题。
脏写:一个事务里对数据正在进行写操作,另一个也可以进来对数据进行写操作,谁也不知
道谁写了什么
脏读:一个事务读到了另一个事务未提交的数据
不可重复读:一个事物在对数据进行读操作时,有另外几个事务对数据进行修改,导致每次
读的数据不一样
MySQL中的锁
根据锁的属性分为:共享锁(读锁、S锁)、排他锁(写锁,X锁)。
根据锁的粒度分为:表锁、行锁(记录锁、间隙锁、临键锁)。
根据锁的状态分为:意向共享锁、意向排它锁。
事务的隔离级别: 由低到高
READ_UNCOMMITTED 读未提交
加个写锁
解决了 脏写问题
存在 脏读、不可重复读、幻读
READ_COMMITTED 读提交(不可重复读)
加个写锁
加个读锁 每次select完成都会释放读锁
解决了脏写、脏读问题
存在不可重复读、幻读
REPEATABLE_READ 可重复读
加个写锁
加个读锁 每次select完不会释放锁,而是事务结束后才释放 如果是MySQL的innodb还会加间隙锁
解决了脏写、脏读、不可重复读问题
存在幻读 (如果是mysql的innodb则不存在这个问题)
SERIALIZABLE 串行化 不会有任何问题出现
事务的隔离级别越高,越安全,但效率会越慢
mysql 默认的隔离级别为 REPEATABLE_READ 可重复读