怎么输出mysql jdbc的默认事务隔离级别

怎么输出mysql jdbc的默认事务隔离级别,第1张

修改方法

有两种方法可以对配置了 systemd 的程序进行资源隔离:1. 命令行修改:通过执行 systemctl set-property 命令实现,形式为 systemctl set-property name parameter=value;修改默认即时生效。2. 手工修改文件:直接编辑程序的 systemd unit file 文件,完成之后需手工执行 systemctl daemon-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 等后缀表示值的大小。与 cgroup memory 控制器 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 语句根据条件扫描到的可能需要加锁的数据范围;

以单个数据范围为例,数据范围全集包含:(数据范围不一定是连续的值,也可能是间隔的值组成)

有一个任务序列控制sql语句的执行,

第一次有select的语句查询表a,mysql服务器在执行select之前将表a加读锁,

第二次又有一条select语句查询表a, mysql服务器发现在任务序列中有表a的读锁,也就是同时还有一个sql查询表a,读锁不会影响这条sql语句,

当有一条update或者insert语句对表a *** 作时,mysql服务器会对表a加写锁,以此提示之后的对表a *** 作的sql语句等待写锁解锁后在执行,以免造成写入与读取的混乱!

如何用java开启mysql事务,要求详细

看你是什么事务,jdbc事务,还是分布式事务,还是容器事务

1,编程式事务管理(jdbc的事务是绑定在connection上的)

Connection conn = null

try

{

Class.forName("com.mysql.jdbc.Driver")

conn = DriverManager.getConnection("jdbc:oracle:thin:@host:1521:SID","username","password")

conn.setAutoCommit(false) //取消自动提交

PreparedStatement ps = conn.prepareCall("update something")

ResultSet rs = ps.executeQuery()

conn.commit() //手动提交

}

catch (Exception e)

{

conn.rollback()

e.printStackTrace()

}

finally

{

conn.close()

}

2,声明式事务

先在工程的application.xml配置文件中添加如下代码,开启事务

<!-- 声明式事务控制配置 -->

<tx:annotation-driven transaction-manager="txManager"/>

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="datasource" ref="bassDataSource"></property>

</bean>

然后在你需要开启事务的接口前面添加注解

@Transactional(rollbackFor = IOException.class)

public void add(String name) throws IOException

{

System.out.println("可以再类里和方法里面添加事务注解0~0")

throw new IOException()

}

直接调用接口方法就好

分布式事务处理(mysql貌似在5.X之后才支持) 的话,

1.可以直接使用spring+atomikos框架进行管理

参考:http://blog.chinaunix.net/uid-21162795-id-3424973.html

就不贴测试代码了,自己看着配置吧

2,使用JTA(Java Transaction API)进行分布式事务管理(测试代码如下)

import java.sql.Connection

import java.sql.PreparedStatement

import java.sql.SQLException

import javax.naming.InitialContext

import javax.sql.DataSource

import javax.transaction.SystemException

import javax.transaction.UserTransaction

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource

//分布式事务处理

public class transferAccount

{

@SuppressWarnings("null")

public void testTransferAccount()

{

UserTransaction userts = null

Connection connA = null

PreparedStatement psA = null

InitialContext context = null

Connection connB = null

PreparedStatement psB = null

try

{

//获得事务管理对象

userts = (UserTransaction) context.lookup("java:comp/UserTransaction")

//获取两个数据库

connA = getDataSourceA().getConnection()

connB = getDataSourceB().getConnection()

//开启事务

userts.begin()

//sql语句

psA = connA.prepareStatement("我加1")

psB = connB.prepareStatement("我减1")

//执行sql

psA.executeUpdate()

psB.executeUpdate()

//事务提交

userts.commit()

} catch (Exception e)

{

try

{

userts.rollback()

} catch (IllegalStateException | SecurityException

| SystemException e1)

{

e1.printStackTrace()

}

e.printStackTrace()

}

finally

{

try

{

psA.close()

psB.close()

connA.close()

connB.close()

} catch (SQLException e)

{

e.printStackTrace()

}

}

}

public DataSource getDataSourceA()

{

MysqlDataSource dataSource = new MysqlDataSource()

dataSource.setDatabaseName("mysql")

dataSource.setServerName("server")

dataSource.setPortNumber(1433)

dataSource.setUser("test")

dataSource.setPassword("test")

return dataSource

}

public DataSource getDataSourceB()

{

MysqlDataSource dataSource = new MysqlDataSource()

dataSource.setDatabaseName("mysql")

dataSource.setServerName("server")

dataSource.setPortNumber(1435)

dataSource.setUser("test1")

dataSource.setPassword("test1")

return dataSource

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/7507796.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-06
下一篇2023-04-06

发表评论

登录后才能评论

评论列表(0条)

    保存