事务是什么
讲事务的csdn文章。我自己理解一下觉得就是为了一个(访问数据库、并且可能会改变数据库内容的)目的,而进行的一系列操作的集合
,附带的特点是:只有全部操作都成功这个目的才算成功,但凡有一个失败,那么其他操作全都应该撤销。
事务的优点就是可以“后悔”,只要中间有个步骤出错,我就可以反悔说:“当我没说/做”。所以设计事务的目的是:保证数据的完整性。
一、COMMIT语句(提交事务)
用来提交当前事务的所有更改,“一系列操作”的最后一步。
在提交后其他用户才知道你干了什么,否则只有你一个人知道自己干了什么。但你提交前别人也会读到你修改的数据——“脏读”,如果你回退了那么别人读取的是无效的数据,“脏数据”。
commit有三种提交方式:显示提交、隐式提交还有自动提交。w3cschool没说这个,可以参考这篇文章。
二、ROLLBACK语句(回滚事务)
用来撤销当前事务或有问题的事务。
比较有意思的参数是:“to savepoint xxxx”保存点,加入这个参数后,回滚会到叫xxxx的保存点就结束,在此保存点前的操作得到保留,此保存点后的操作全都被撤销。如果省略这个子句,则默认全部撤销。
保存点的设置方法:在两个操作中间声明。例如:
INSERT INTO table1(a,b,c) VALUES('aaa','bbb','ccc');
SAVEPOINT SAVE_A;
INSERT INTO table2(a1,b1,c1) VALUES('aaa1','bbb1','ccc1');
三、SET TRANSACTION语句(设置事务)
用来设置事务的各种状态,比如只读、读/写、隔离级别,为事务分配名称或将事务分配回滚段等等。
看起来除了设置读写权限和隔离级别以外,用处不太大。
四、LOCK TABLE语句(锁表)
用来锁定表、表分区或表子分区。
主要是lock_mode有六种,但是含义感觉好相似,好难懂。 参考了一下这篇文章:
2.1 EXLUSIVE排他锁
表级锁:当一个Session获取到了排他锁以后,其他用户只能进行查询操作,一般对一张表进行drop操作时获得该锁。
2.2 SHARE共享锁
表级锁:SHARE模式允许并发查询,但是一个Session如果获得了共享锁,那么就不能对该表进行update操作。
2.3 ROW SHARE行共享模式
行级锁:允许并发访问,但是不允许用户独占式访问。这个锁模式等价于WITH SHARE UPDATE(以前老版本的写法)
2.4 ROW EXCLUSIVE行排他模式
行级锁:ROW EXCLUSIVE模式一般来说用户不会手动进行设置,在一个Session会话对数据库进行insert、update以及delete操作时,该用户就会自动的获取到这个ROW EXCLUSIVE锁。在ROW EXCLUSIVE和ROW SHARE模式一样,但是如果一个Session获得了ROW EXCLUSIVE锁,那么另外的Session就不能进行ROW EXCLUSIVE锁定,也不能对该表进行SHARE锁定。
2.4 SHARE ROW EXLUSIVE共享行排他
行级锁:如果一个Session获取了SHARE ROW EXLUSIVE锁,该用户以及其他用户可以对整张表进行查询,但是,不允许其他用户对该表进行SHARE锁定或者更新表的数据。
还是感觉蛮难懂的,以后遇到再转头仔细看吧。
总结
这一章就是讲事务这个技术怎么用。首先搞清楚事务,是为了保护数据完整性,方便及时回退,对一串操作进行“包裹”的技术。然后开始事务用的“begin”,提交事务用的“commit”,设置回退点“savepoint xxx”,回退就“rollback to savepoint xxx”,设置事务用“set transaction”,更进一步保护数据完整性可以加上锁表操作“lock table”。