声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。
1.高级锁读取方式
悲观锁是系统自己增加的锁,乐观锁是程序员用程序逻辑来自己设计的一种锁机制。
怎么查看事务的隔离级别:
命令:select @@tx_isolation 查出来的隔离级别如上:
REPEATABLE-READ:这种隔离级别是不会出现脏读现象的。
要实现脏读这个现象,要设置隔离级别为:读取未提交内容
set session tx_isolation=’read-uncommitted’:
设置好读取未提交内容这个隔离级别以后,我们在事务A中把表的数据改为789,并没有提交,但是在事务B中,查出来的确是789,说明可以读取到没有提交的事务。
在这种隔离级别下,是很容易造成问题的:比如,bankid里面,发工资了,但是不确定要发多少。在事务A中先发10000,不提交(因为没有确认),然后事务B查看,发现金额有10000,(这种隔离级别下能读取未提交的内容),但是事务A发现不应该发10000,所以rollback一下,然后事务B再去查看的时候,发现10000没了。这就是脏读现象了:
如果想避免脏读现象的发生,要改变隔离级别为read-committed,只读取提交的内容这种隔离级别。
很多时候,人们设置读取未提交内容这个隔离级别,是为了加快读取的速度而冒着产生脏读这种现象的风险的。可见脏读读取的数据是无意义的,是无效的,为了防止这种问题,我们要设置隔离级别为只读取提交的内容。
不可重复读:当一个事务多次读取的时候,发现数据有变化,但是又不知道这个数据是不是确定的,不知道它会不会再改,这种现象也是在读取未提交内容这个隔离级别下产生的。
怎么防止这种现象发生:
将隔离级别设置为repeatable-read这种,然后就发现事务B中修改的金额(未提交事务),在事务A中读取多少次都是不会变的。默认的隔离级别就是这种隔离级别。上面四种级别,可以自己更换。这种默认的隔离级别,可以防止脏读和不可重复读,但是防止不了幻读。
幻读:先设置隔离级别为:read-uncommitt,然后这种现象就是:事务A先查看了一下数据,然后它想把所有数据中的金额上调1000,然后事务B插入一条数据,没有1000那么多,比如10或者20,然后事务A再查看数据的时候,发现多了一条数据记录,但是是没有加1000的,事务Brollback一下,然后事务A不知道这个操作,它还以为有两条数据,于是又把数据中金额上调1000,再查看的时候,第一条数据相当于上调了2000.:
要防止幻读,就要设置隔离级别为:serializable:
幻读就是,用户A一开始读出来的几条数据,我将它修改了一下,然后别的用户B新增了几条数据,用户A再次进行读取的时候,发现有几条数据没有修改到,这就像发生了幻觉一样。
为啥设置隔离级别:一般,我们上锁的话,别的事务是无法进行修改的,也有一些连读也读不成。
有些业务上,需要发生某些现象,比如卖火车票的时候,需要发生幻读:事务A,最开始想买三张票,查出来三张票,则系统就要保证这查出来的三张票要能够卖给事务A,不能你查出来后,下一秒付款的时候,发现又买不了了。所以我们一查出来,就要把三张票标记为已售,但具体买几张,看实际情况,比如事务A后面只买了一张,那就要把另外两张没有买的还原为未售的状态,这时,在事务B的眼中,最开始的时候,被事务A查出的三张票是查不到的,但是后面等A买完后,发现又多了两张票可以查到了,这就相当于幻读的现象了。
这里要使用隔离级别而不要使用锁,上锁的话,是会读取到别的用户打算购买的票的。
这种方法能确认你只要查的出来就能买的着,这就是为啥买票的时候会有一直刷的情况。
用图形化,做一个例题:
用Swing画一个图形窗口,如上图所示.
票务数据的代码设计如上。
查询票务的事件代码如上。
如上图所示,查询后,就把查询出来的票的状态改为0了,但是此时还没有提交事务,并且这里能读取未提交的内容。
上面是取消查询和确认购买的事件代码。
如上图,选定的4、5、6、7四张票就会被占住,状态被改为已售了。
点击取消查询后,进行了回滚,则5、6、7三张票的状态又变为待售了。
程序一断开,所做的操作全部会回滚。
脏读、不可重复读、幻读,这些现象都是可以使用到某些业务上去的。业务要选择不同的隔离级别,来符合实际的逻辑情况。
相关推荐
《深入理解JDBC Driver 3.0:聚焦SQL Server JDBC》 在IT行业中,数据库连接是应用程序与数据存储之间的桥梁,而JDBC(Java Database Connectivity)则是Java平台中用于访问数据库的标准API。JDBC Driver 3.0是针对...
SQL Server驱动包是用于Java应用程序通过JDBC(Java Database Connectivity)接口与Microsoft SQL Server数据库进行交互的必备组件。本文将详细介绍这两个重要的驱动文件——sqljdbc.jar和sqljdbc4.jar,以及如何...
SQLJDBC和SQLJDBC4是Microsoft为Java应用程序提供的用于连接SQL Server数据库的驱动程序。这两个版本都是JDBC(Java Database Connectivity)驱动,允许Java开发者在应用程序中与SQL Server进行交互。下面将详细介绍...
Java数据库连接(JDBC)是Java编程语言中用于与各种数据库进行交互的一组接口和类。JDBC-ODBC桥是JDBC最初提供的一种连接数据库的方式,它允许Java应用程序通过ODBC(Open Database Connectivity)来访问数据库。...
Spring Data JDBC与JDBC是两种不同的数据库访问方式,它们在Java开发中有着广泛的应用。JDBC(Java Database Connectivity)是Java平台的标准API,用于与各种数据库进行交互。它提供了低级别的数据库操作,如建立...
SQL Server JDBC驱动是Microsoft公司为SQL Server数据库开发的一套Java数据库连接驱动,它允许Java应用程序通过Java数据库连接API(JDBC)与SQL Server数据库进行交互。JDBC是Java中用于数据库交互的标准API,它提供...
【标题】:“JDBC Proxy 代理类” 在Java开发中,JDBC(Java Database Connectivity)是连接数据库的主要方式。然而,直接使用JDBC代码往往繁琐且易出错,因此引入了代理类(Proxy Class)的概念,它能为JDBC提供更...
mysql jdbc 驱动 适用于5.6版本及以下数据库 mysql jdbc 驱动 适用于5.6版本及以下数据库 mysql jdbc 驱动 适用于5.6版本及以下数据库 mysql jdbc 驱动 适用于5.6版本及以下数据库 mysql jdbc 驱动 适用于5.6版本及...
mysql jdbc 驱动 适用于5.7及以上版本数据库 mysql jdbc 驱动 适用于5.7及以上版本数据库 mysql jdbc 驱动 适用于5.7及以上版本数据库 mysql jdbc 驱动 适用于5.7及以上版本数据库 mysql jdbc 驱动 适用于5.7及以上...
在Java编程语言中,JDBC(Java Database Connectivity)是一个核心的API,用于连接Java应用程序与各种类型的数据库。这里我们关注的是两个特定版本的Microsoft SQL Server的JDBC驱动:sqljdbc41.jar和sqljdbc42.jar...
sqljdbc.jar 类库提供对 JDBC 3.0 的支持。 sqljdbc.jar 类库要求使用 5.0 版的 Java 运行时环境 (JRE)。连接到数据库时,在 JRE 6.0 上使用 sqljdbc.jar 会引发异常。 注意: JDBC Driver 2.0 不支持 JRE 1.4。...
在给定的压缩包文件中,包含了三个不同版本的达梦JDBC驱动,分别是Dm7JdbcDriver16.jar、Dm7JdbcDriver17.jar和Dm7JdbcDriver18.jar。 1. **JDBC驱动介绍**: JDBC是Java中用于与各种数据库进行交互的标准接口,它...
为了实现Java应用程序与Oracle数据库之间的连接,Oracle公司提供了JDBC(Java Database Connectivity)驱动。JDBC是一种Java API,用于连接和执行查询与数据库的操作。随着技术的不断更新,Oracle数据库也在不断地...
JDBC 基础知识点 JDBC(Java Database Connectivity)是一种Java标准的数据库连接API,它允许Java程序访问各种关系数据库。下面是JDBC的基础知识点: 一、JDBC原理概述 * JDBC是一套协议,由Sun定义的一组接口,...
KingbaseV8 JDBC驱动是连接KingbaseV8数据库的重要组件,允许Java应用程序通过JDBC(Java Database Connectivity)接口与数据库进行交互。JDBC是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了...
SQL Server 2000 JDBC 是Java编程语言与Microsoft SQL Server 2000数据库进行交互的一种重要方式。JDBC(Java Database Connectivity)是Java API,允许Java应用程序通过Java虚拟机(JVM)与各种数据库建立连接。在...
标题 "Access_JDBC30" 暗示了这是一个与Microsoft Access数据库相关的Java JDBC驱动程序。JDBC(Java Database Connectivity)是Java编程语言中用于连接和操作数据库的标准接口。这个jar包,"Access_JDBC30.jar",...
在IT行业中,数据库是至关重要的组成部分,而SQL Server作为一款广泛应用的关系型数据库管理系统,它的连接与操作离不开JDBC(Java Database Connectivity)驱动。本篇将详细介绍如何下载和安装sqljdbc4,这是...
Access的JDBC驱动是Java数据库连接(Java Database Connectivity, JDBC)的一种实现,它允许Java程序与Microsoft Access数据库进行交互。在JDK 1.8之后,Oracle公司不再默认提供对ODBC(Open Database Connectivity...