事务的特性
原子性:事务是原子的,要么都做,要么都不做
一致性:事务执行的结果必须保证数据库从一个一致性状态变到另一个一致性状态
隔离性:事务相互隔离。当多个事务并发执行时,任一事务的更新操作直到其成功提交的整个过程,对其他事务都是不可见的。
持久性:一旦事务成功提交,即使数据库崩溃,其对数据库的更新操作也永久有效
并发问题
并发产生的问题 | 丢失更新 |
不可重复读问题 | |
读‘脏‘数据’ |
更新丢失
T1 | T2 |
读A=10 A=A-5写回 | 读A=10 A=A-8写回 |
嘉定A的值是10,T1一开始读取之后,做了A-5写回。T2在T1写回操作前也读取了A,A=10,也做了A=A-8写回,把T1写回给覆盖了。
不可重复读
假定A=20,B=30
TI读取了AB的值,进行一次A+B求和,结果是50。T2也读取了A的值,并进行了A+50的操作,A的值变为70,之后T1再读取A,B的值,再进行A+B的操作,结果是100,和头一次A+B的值对不上
读“脏”数据
假定A的值是20,T1进行了A+50的操作,A的值变为70,接着T2读取A,这时候A的值是70,再之后,T1进行了回滚,撤销了+50的操作,A变回20,而T2那边的值还是70,产生冲突
并发产生问题解决思路
封锁协议
X锁(写锁/排他锁/独占锁)的加锁规则
若事务T对数据对象A加上X锁,其他事务不能再对A添加任意锁
S锁(共享锁/读锁)的加锁规则
若事务T对数据对象A加上S锁,其他事务只能对A再加S锁,不能再对A添加X锁