一,关系型数据库(sqlserver、mysql、oracle)的事务隔离机制说明
下面是设置MySQL数据库的事务隔离机制的sql语句:
set global transaction isolation level read uncommitted;
将全局事务隔离级别设置为未提交读取;
下面是事务隔离的几个机制:
1、read uncommitted(读取未提交的数据)
缺点:如果数据最终rollback了,那么读取的数据就错了
2、read committed(读取已经提交的数据)
缺点:如果在一个事务中,对通过一个数据进行了多次的读取。在多次读取的过程中,有人
提交了数据。那么多次读取的数据结果就会出现不一致。
3、repeatable read(重复读)
缺点:会出现幻读。
4、serializable(串行)
缺点:太慢
二,redis事务机制
1、 MULTI 与 EXEC命令
以 MULTI 开始一个事务,然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务,
一并执行事务中的所有命令
2、 DISCARD命令
DISCARD 命令用于取消一个事务, 它清空客户端的整个事务队列, 然后将客户端从事
务状态调整回非事务状态, 最后返回字符串 OK 给客户端, 说明事务已被取消。
乐观锁:一个版本控制 update table set age=13 where v=1
悲观锁:
3、WATCH命令(类似乐观锁)
WATCH 命令用于在事务开始之前监视任意数量的键: 当调用 EXEC 命令执行事务时,
如果任意一个被监视的键已经被其他客户端修改了, 那么整个事务不再执行, 直接返回失败。
三,示例
3.1,示例一 这个例子中没有出现异常,所以所有的命令都成功了
3.2,这个例子中,在事务开启后,有一个命令执行出错了,那么所有的命令都不会执行
3.3,这个例子中出现了两个事务,两个事务都表示自己执行成功了,但是有一个发现值并不是自己设置的,被别人覆盖了
3.4,加上Watch age后,再来执行事务。
左边的再开启事务之后,exec执行之前,右边有另外一个事务对age进行了修改。那么左边的事务将执行失败