1 事务的作用:
当同一个操作需要多条sql执行,一条执行失败,其余哪怕执行成功了也要回滚数据;除非所有的sql都完美的执行成功了。需要用一个事务把这一系列的sql执行概括成为一个整体,这个整体的特性如下:
A原子性--强调这些操作的不可再分的特性;
C一致性--强调这些操作的执行结果应该是正确的;
I隔离性--强调多个事务应该是可以并发的、且是一致的;
并发的事务需要考虑的问题有:数据的一致性。
D持久性--强调事务执行的数据最终是可以被放到数据库中的;
2 详细说明事务的隔离性
隔离性需要考虑数据的三种情况,分别是:
脏读-- 一个事务尚未提交,但它的数据却被另一个事务读取。这是不允许出现的!!!
不可重复读-- 一个事务被提交后,被另外一个事务读取。但这条数据又被修改了,所以会造成数据的不一致性。(使用 行锁)
幻读--事务A读取若干行后,事务B以插入或者删除行的方式修改事务A读取的若干行,并提交,会造成数据的不一致性。(使用表锁)。
隔离等级:一个事务必须与其它事务进行资源或数据更改相隔离的程度。从允许并发副作用的角度考虑。(来自百度百科)
未提交读(不能避免幻读以及其它)
已提交读(避免脏读,不能避免不可重复读和幻读)
可重复读(避免脏读和不可重复读,不能避免幻读)
序列化(避免脏读、不可重复读、幻读)
注:图片来自图解 & 深入浅出JavaWeb:事务必会必知
3 锁的分类:
为了处理隔离性的问题,隔离等级通过锁的机制来控制并发线程。
共享锁:加了共享锁的数据库对象可以被读取,但是不可以被其它线程写入。
独占锁:加了独占锁的数据库对象,既不可以被读取也不可以被写入。
“
事务隔离级别是并发控制的整体解决方案,其实际上是综合利用各种类型的锁和行版本控制来解决并发问题。
锁是数据库并发控制的内部机制,是基础
对用户来说,只有当事务隔离级别无法解决一些并发问题和需求时,才有必要在语句中手动设置锁,不恰当的设置锁可能导致严重的阻塞和死锁。建议在完全了解锁机制的情况下,才可以再语句中手动设置锁,否则应该使用事务隔离级别。
” ----------------来自 事务隔离级别和锁的关系