1.事务的特性: ACID 原子性,一致性,隔离性,持久性
·隔离性-->一个事务执行的过程中,不应该受到其他的事务的干扰
2.如果不考虑隔离性,就会引发一些 读 的问题
·脏读 --> 一个事务读到另一个事务未提交的数据
·不可重复读 --> 一个事务读到了另一个事务已经提交的update数据,导致多次查询结果不一致
·虚读(幻读) --> 一个事务读到了另一个事务已经提交的insert数据,导致多次查询的结果不一样
3.通过设置数据库的隔离级别来解决上述读的问题
-未提交的读(Read uncommitted): 以上读的问题都有可能发生
·已提交的读(Read committed): 避免了脏读,但是不可重复都,幻读有可能发生
·可重复读(Repeatable): 避免了脏读,不可重复读,但是幻读避免不了
·串行化(Serializable): 以上读的情况都可以避免
4.如果不考虑隔离性,也会产生写入的问题,这一类的问题叫丢失更新问题
·例如: 两个事务同时获取到一条记录做修改,一个事务拿到一条记录的信息进行修改,在未提交的情况下,
另一个事务又拿到了这天记录的信息,这时候第一个拿到信息的事务提交了数据。之后后来的那个事务
提交的数据就会覆盖的第一个事务提交的数据,这样就叫 丢失更新
4.1解决丢失更新有两种方案
·悲观锁: 采用的是数据库提供的一种锁机制,在SQL语句的后面添加for update 字句
·当A事务在操作该记录时,会把这条记录锁起来,其他事务是不能操作这条记录的
·只有当A事务提交后,锁释放了,其他事务才能操这条记录
·乐观锁: 采用版本号的机制来解决的。会给表结构添加一个字段version=0,默认值是0
·当事务A在操作完该记录时,会先保存一个版本号,提交事务时,会先检查版本号,如果发现版本号的值相同时
才可以提交事务,同时会更新版本号version
·当事务B操作完该条记录时,提交事务时,会先检查版本号,如果发现版本不同的时候,就会程序出错
这时候,就可以返回个客户端提示 用户,更新失败,请从新提交