事务是并发控制的基本单位,为了保证事务的隔离性和一致性,需要对并发操作进行正确的调度。
1、并发操作带来的不一致问题:
(1)丢失修改:
两个事务读取同一个数据,并对该数据进行修改,T1提交的数据破坏了T2提交的数据,即后提交的数据覆盖了先提交的数据,导致先提交的数据结果被覆盖了。
(2)不可重复读:
事务T1读取到某一数据后,事务T2对该数据进行了修改,当T1再次读取该数据的时候发现数据已经改变。
(3)读脏数据:
事务T1读取到某一数据并对其修改,T2读取到了修改后的数据,但是由于某种原因,T1被撤销,T2读取到的数据与T1的实际值存在不一致。
即:事务T2读取到了T1尚未提交的数据。
2、数据库的封锁:
封锁是实现并发控制的重要技术。
read uncommitted : 读取尚未提交的数据
read committed:读取已经提交的数据 ,可以解决脏读 ,oracle默认的级别。
repeatable read:重读读取,可以解决脏读 和 不可重复读 ,mysql默认的级别。
serializable:串行化,可以解决 脏读 不可重复读 和 丢失修改,相当于锁表,会使得数据库的效率极低。
(1)查询mysql数据库的隔离级别:
SELECT @@tx_isolation
即:mysql数据库的默认封锁级别是:repeatable read
(2)mysql数据库的隔离级别的修改:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
即:在mysql数据库中不会出现脏读 和 不可重复读的现象。