什么是事务
事务指的是构成单一逻辑工作单元的操作的集合。事务是访问并可能更新各种数据项的一个程序执行单元。事务通常由高级数据操纵语言(如SQL)或编程语言通过JDBC/ODBC嵌入式数据库访问书写的用户程序的执行所引起的。
事务的4个特性
原子性:事务的所有操作在数据库中要么全部正确反映出来,要么完全不反映。
一致性:隔离执行事务时(换言之,在没有其他事务并发执行的情况下)保持数据库的一致性。
隔离性:每个事务都感觉不到系统中有其他事务在并发地执行。
持久性:一个事务成功完成之后,它对数据库的改变必须是永久的,即使出现系统故障。
存储结构
易失性存储器
非易失性存储器
稳定性存储器
为了一个事务能够持久,它的修改应该写入稳定性存储器;同样,为了一个事务是原子的,日志记录需要在对磁盘上的数据库做出任何改动之前写入稳定性存储器。
事务隔离性级别
SQL标准规定的隔离性级别如下:
可串行化:通常保证可串行化调度。
可重复读:只允许读取已提交数据,而且在一个事务两次读取一个数据项期间,其它事务不得更新该数据。但该事务不要求与其它事务可串行化。
已提交读:只允许读取已提交数据,但不要求可重复读。
未提交读:允许读取未提交数据。
以上所有隔离线性级别都不允许脏写,即如果一个数据项已经被另外一个尚未提交或终止的事务写入,则不允许对该数据项执行写操作。
并发控制机制
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
乐观锁:假定不会发生并发冲突,只在提交操作时检查是否违反数据完整性。乐观锁不能解决脏读问题。
(脏读:此种异常时因为一个事务读取了另一个事务修改了但是未提交的数据。举个例子,事务一更新了count=101,但是没有提交,事务二此时读取count,值为101而不是100,然后事务一出于某种原因回滚了,然后第二个事务读取的这个值就是噩梦的开始。)
悲观锁
一般都是依靠关系数据库提供的锁机制,事实上关系数据库中的行锁、表锁不论是读写锁都是悲观锁。
悲观锁按照使用性质划分:
1.共享锁
2.排它锁
3.更新锁
按照作用范围划分:
1.行锁
2.表锁
乐观锁
乐观锁需要用户自己去实现。既然都有数据库提供的悲观锁可以方便使用,为什么要使用乐观锁呢?对于读操作远多于写操作的时候,大多数都是读取,这时候一个更新操作加锁或阻塞所有读取,降低了吞吐量。最后还要释放锁,锁是需要一些开销的,我们只要想办法解决极少量的更新操作的同步问题。
乐观锁实现方式有:
1.使用数据版本记录机制实现。
2.使用时间戳。