什么是事务?
-
包含一条或者多条sql语句的逻辑工作单元。
为什么有?
-
方便应用层使用,简化数据库操作,提交和回滚
基本特性有哪些?
ACID:
-
A原子性(手段):事务中操作,要么都执行,要么都不。
-
I隔离性(手段):事务的操作和正在操作的数据 被封锁起来,不让其他事务操作。
-
D持久性(手段):事务一旦提交,都能找到这个永久的状态。
-
C一致性(目的):一正确状态到另一正确状态。
并发带来的问题:
-
丢失更新:我们更新的数据被其他更新覆盖掉,我们更新的数据就丢失了。
-
脏读:两个并发事务,其中一个读到了正在被操作的数据,出现不一致的问题。
-
不可重复读:同一行数据,第一次和第二次不一样。
-
幻读:第一次读一行,第二次读两行。
-
死锁:事务过程中,因 操作数据 和 争夺锁 而造成一种互相等待的现象。
怎么解决?
-
丢失更新:都不加锁,写加锁。排他锁。
隔离级别:
-
读未提交:一事务还未提交,但可读到改变。无安全性,不用。
-
读已提交(数据库默认):能读到已提交的更新,解决脏读和丢失更新,底层MVCC多版本并发控制
-
可重复读(mysql默认):多次查询结果一样,解决脏读和不可重复读,底层MVCC多版本并发控制
-
串行化:强制串行执行,效率低,少用。