1.事务的4大基本要素(ACID)
原子性(Atomicity):事务是一个不可分割的工作单位,其中的操作要么都发生,要么都不发生。
一致性(Consistency):事务前后数据的完整性必须保持一致。
隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。
持久性(Durability):事务一旦提交,它对数据库中数据的改变是永久性的。
2.事务的并发问题
脏读:在一个事务处理过程里读取了另一个未提交的事务中的数据。
不可重复读:在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
幻读:幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,
而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
3.4种隔离级别以及对应的原理
Read uncommitted (读未提交):最低级别,任何情况都无法保证。原理:任何操作都不加锁。
Read committed (读已提交):可避免脏读的发生。原理:行级排它锁。
peatable read (可重复读):MySQL的默认隔离级别。可避免脏读、不可重复读的发生。原理:读操作加行级共享锁,写操作加行级排它锁。
Serializable (串行化):可避免脏读、不可重复读、幻读的发生。原理:锁表,读操作加表级共享锁,写操作加表级排它锁,并发性极低,开发中很少使用。
4.数据库中的锁
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。
数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。