一、原子性(Atomicity):事务开始后全部操做,要么所有作完,要么所有不作,不可能停滞在中间环节。事务执行过程当中出错,会回滚到事务开始前的状态,全部的操做就像没有发生同样。也就是说事务是一个不可分割的总体,就像化学中学过的原子,是物质构成的基本单位。mysql
二、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。好比A向B转帐,不可能A扣了钱,B却没收到。sql
三、隔离性(Isolation):同一时间,只容许一个事务请求同一数据,不一样的事务之间彼此没有任何干扰。好比A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转帐。数据库
四、持久性(Durability):事务完成后,事务对数据库的全部更新将被保存到数据库,不能回滚。并发
一、丢失更新spa
两个不一样事物同时得到相同数据,而后在各自事务中同时修改了该数据,那么先提交的事务更新会被后提交事务的更新给覆盖掉,这种状况事务A的更新就被覆盖掉了、丢失了。code
举个栗子:对象
事务A 事务B 读取X=100 读取X=100 写入x=X+100 写入x=X+200 事务结束x=200 事务结束x=300 最后x=300
二、脏读(未提交读) 事务
事务A读取了事务B更新的数据,而后B回滚操做,那么A读取到的数据是脏数据ci
三、不可重复读it
事务 A 屡次读取同一数据,事务 B 在事务A屡次读取的过程当中,对数据做了更新并提交,致使事务A屡次读取同一数据时,结果 不一致。
举个栗子:
事务A 事务B 读取X=100 读取X=100 读取X=100 写入x=X+100 事务结束, x=200 读取X=200 (此时,在同一个事务A中, 读取的X值发生了变化!) 事务结束
四、幻读
事务A读的时候读出了15条记录,事务B在事务A执行的过程当中 增长 了1条,事务A再读的时候就变成了 16 条,这种状况就叫作幻影读。
不可重复读和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住知足条件的行,解决幻读须要锁表
是:还存在,不能避免; 否:不存在,能避免
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
排他锁(X锁):若事务T对数据对象A加上X锁,则只容许T读取和修改A,其余任何事务都不能在对A加任何类型的锁,直到T释放A上的锁为止。这就保证了其余事务在T释放A上的锁以前不能再读取和修改A。
共享锁(S锁):若事务T对数据对象A加上S锁,则只容许T读A但不能修改A,其余事务只能再对A加S锁而不能加X锁,知道T释放A上的S锁为止。
一级封锁协议(对应 read uncommited) :
事务T在修改数据R以前必须先对其加X锁,直到事务结束才释放。一级封锁协议能够防止丢失修改,并保证事务T是可恢复的。
二级封锁协议(对应read commited):
在一级封锁协议基础上增长事务T在读数据R以前必须先对其加S锁,读完后便可释放S锁。二级封锁协议出防止了丢失修改,还能够进一步防止读“脏”数据。
三级封锁协议(对应reapetable read ):
在一级封锁协议的基础上增长事务T在读数据R以前必须先对其加S锁,直到事务结束才释放。三级封锁协议出防止了丢失修改和读“脏”数据外,还能够进一步防止了不可重复读。
串行化:
一二三级封锁协议都是在行级加锁,而串行化是对整表加锁。读数据时对整表加共享锁,修改数据对整表加排他锁。