① 解释什么是隔离级别,以db2为例,数据库提供了哪几种隔离级别每种隔离级别都避
1.查看当前会话隔离级别
select @@tx_isolation;
2.查看系统当前隔离级别
select @@global.tx_isolation;
3.设置当前会话隔离级别
set session transaction isolatin level repeatable read;
4.设置系统当前隔离级别
set global transaction isolation level repeatable read;
5.命令行,开始事务时
set autocommit=off 或者 start transaction
关于隔离级别的理解
1.read uncommitted
可以看到未提交的数据(脏读),举个例子:别人说的话你都相信了,但是可能他只是说说,并不实际做。
2.read committed
读取提交的数据。但是,可能多次读取的数据结果不一致(不可重复读,幻读)。用读写的观点就是:读取的行数据,可以写。
3.repeatable read(MySQL默认隔离级别)
可以重复读取,但有幻读。读写观点:读取的数据行不可写,但是可以往表中新增数据。在MySQL中,其他事务新增的数据,看不到,不会产生幻读。采用多版本并发控制(MVCC)机制解决幻读问题。
4.serializable
可读,不可写。像java中的锁,写数据必须等待另一个事务结束。
② java中的Connection是什么,有哪些方法 每个方法的返回值是什么意思
这个东西是java api中提供的一个接口,他的实现类由其他厂商完成,用于与数据库的链接
void clearWarnings()
清除为此 Connection 对象报告的所有警告。
void close()
立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放。
void commit()
使自从上一次提交/回滚以来进行的所有更改成为持久更改,并释放此 Connection 对象当前保存的所有数据库锁定。
Statement createStatement()
创建一个 Statement 对象来将 SQL 语句发送到数据库。
Statement createStatement(int resultSetType, int resultSetConcurrency)
创建一个 Statement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
创建一个 Statement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。
boolean getAutoCommit()
检索此 Connection 对象的当前自动提交模式。
String getCatalog()
检索此 Connection 对象的当前目录名称。
int getHoldability()
检索使用此 Connection 对象创建的 ResultSet 对象的当前可保存性。
DatabaseMetaData getMetaData()
获取 DatabaseMetaData 对象,该对象包含关于 Connection 对象连接到的数据库的元数据。
int getTransactionIsolation()
检索此 Connection 对象的当前事务隔离级别。
Map<String,Class<?>> getTypeMap()
将给定的 TypeMap 对象安装为此 Connection 对象的类型映射表。
SQLWarning getWarnings()
检索此 Connection 对象上的调用报告的第一个警告。
boolean isClosed()
检索此 Connection 对象是否已经被关闭。
boolean isReadOnly()
检索此 Connection 对象是否处于只读模式。
String nativeSQL(String sql)
将给定的 SQL 语句转换成系统本机 SQL 语法。
CallableStatement prepareCall(String sql)
创建一个 CallableStatement 对象来调用数据库存储过程。
CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency)
创建一个 CallableStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
创建一个 CallableStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
PreparedStatement prepareStatement(String sql)
创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
创建一个默认 PreparedStatement 对象,该对象能检索自动生成的键。
PreparedStatement prepareStatement(String sql, int[] columnIndexes)
创建一个能够返回由给定数组指定的自动生成键的默认 PreparedStatement 对象。
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
创建一个 PreparedStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
创建一个 PreparedStatement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。
PreparedStatement prepareStatement(String sql, String[] columnNames)
创建一个能够返回由给定数组指定的自动生成键的默认 PreparedStatement 对象。
void releaseSavepoint(Savepoint savepoint)
从当前事务中移除给定 Savepoint 对象。
void rollback()
取消在当前事务中进行的所有更改,并释放此 Connection 对象当前保存的所有数据库锁定。
void rollback(Savepoint savepoint)
取消设置给定 Savepoint 对象之后进行的所有更改。
void setAutoCommit(boolean autoCommit)
将此连接的自动提交模式设置为给定状态。
void setCatalog(String catalog)
设置给定目录名称,以便选择要在其中进行工作的此 Connection 对象数据库的子空间。
void setHoldability(int holdability)
将使用此 Connection 对象创建的 ResultSet 对象的可保存性 (holdability) 更改为给定可保存性。
void setReadOnly(boolean readOnly)
将此连接设置为只读模式,作为驱动程序启用数据库优化的提示。
Savepoint setSavepoint()
在当前事务中创建一个未命名的保存点 (savepoint),并返回表示它的新 Savepoint 对象。
Savepoint setSavepoint(String name)
在当前事务中创建一个具有给定名称的保存点,并返回表示它的新 Savepoint 对象。
void setTransactionIsolation(int level)
试图将此 Connection 对象的事务隔离级别更改为给定的级别。
void setTypeMap(Map<String,Class<?>> map)
安装给定的 TypeMap 对象作为此 Connection 对象的特定类型映射。
③ 怎么查看数据库隔离级别
修改方法
有两种方法可以对配置了 systemd 的程序进行资源隔离:1. 命令行修改:通过执行systemctl set-property命令实现,形式为systemctl set-propertyname parameter=value;修改默认即时生效。2. 手工修改文件:直接编辑程序的 systemd unit file 文件,完成之后需手工执行systemctldaemon-reload更新配置,并重启服务systemctl restart name.service。
systemd unit file 里支持的资源隔离配置项,如常见的:
CPUQuota=value
该参数表示服务可以获取的最大 CPU 时间,value 为百分数形式,高于 100% 表示可使用1 核以上的CPU。与 cgroup cpu 控制器cpu.cfs_quota_us配置项对应。
MemoryLimit=value
该参数表示服务可以使用的最大内存量,value 可以使用 K, M, G, T 等后缀表示值的大小。与 cgroupmemory 控制器memory.limit_in_bytes配置项对应。
事务的4种隔离级别
READ UNCOMMITTED 未提交读,可以读取未提交的数据。
READ COMMITTED 已提交读,对于锁定读(select with for update 或者 for share)、update 和 delete 语句,InnoDB 仅锁定索引记录,而不锁定它们之间的间隙,因此允许在锁定的记录旁边自由插入新记录。
Gap locking 仅用于外键约束检查和重复键检查。
REPEATABLE READ 可重复读,事务中的一致性读取读取的是事务第一次读取所建立的快照。
SERIALIZABLE 序列化在了解了 4 种隔离级别的需求后,在采用锁控制隔离级别的基础上,我们需要了解加锁的对象(数据本身&间隙),以及了解整个数据范围的全集组成。
数据范围全集组成
SQL 语句根据条件判断不需要扫描的数据范围(不加锁);
SQL 语句根据条件扫描到的可能需要加锁的数据范围;
以单个数据范围为例,数据范围全集包含:(数据范围不一定是连续的值,也可能是间隔的值组成)
④ .spring的事务有几种方式spring事务的隔离级别和传播行为是什么
Spring提供了许多内置事务管理器实现,常用的有:
DataSourceTransactionManager(JDBC局部事务);
JtaTransactionManager(JTA全局事务);
HibernateTransactionManager(Hibernate事务)。
一、事务的隔离级别:
数据库系统提供了4种事务隔离级别,在这4种隔离级别中,Serializable的隔离级别最高,Read Uncommitted的隔离级别最低;
Read Uncommitted:读未提交数据;(会出现脏读)
Read Committed:读已提交数据;
Repeatable Read:可重复读;
Serializable:串行化。
二、事务的传播属性包括:
Required:业务方法需要在一个事务中运行,如果一个方法运行时已经处在一个事务中,那么加入到该事务,否则为自己创建一个新事务,80%的方法用到该传播属性:
Not-Supported
Requiresnew
Mandatoky
Supports
Never
Nested