mysql 事务 线程-mysql事物隔离的问题,求大神指教

问题描述

mysql事物隔离的问题,求大神指教
我对mysql事物隔离性一向是一知半解,这次还是下决心做了一个测试,不过测试的结果无法解释
求大神指教:
主函数如下:
public static void main(String args[]) {
// 初始化数据库
String dev = ""com.mysql.jdbc.Driver"";
String url = ""jdbc:mysql://localhost:3306/testdb?relaxAutoCommit=true&zeroDateTimeBehavior=convertToNull&characterEncoding=utf8"";
String user = ""root"";
String pwd = ""123456"";

    DBCPOper oper = new DBCPOper();    // SimpleDbOper oper = new SimpleDbOper();    oper.initDB(dev url user pwd);    COMMDB.initDB(oper);    System.out.println(""begin db..."");    Thread t = new Thread(new AddDba());    t.start();    t = new Thread(new AddDbb());    t.start();}private static class AddDba implements Runnable {    @Override    public void run() {        try {            TransDBOper trans = null;            trans = COMMDB.getDBTrances();//这句话相当于打开一个事务,后面的那些操作只要是在同一个线程,那么用同一个事物            if (trans != null) {                System.out.println(Thread.currentThread().getName() + ""|trans is open"");                trans.setThreadTrans();            }            String sql = ""update testdb set value = value + 1"";            for (int i = 0; i < 1000; i++) {                System.out.println(Thread.currentThread().getName() + ""(""+i+"")"");                COMMDB.executeUpdate(sql);            }            if (trans != null) {                System.out.println(Thread.currentThread().getName() + ""|trans is close"");                TransDBOper.closeThreadTrans(true);//这个相当于关闭事务,并且commit            }        } catch (Exception e) {            e.printStackTrace();        }    }}private static class AddDbb implements Runnable {    @Override    public void run() {        try {            TransDBOper trans = null;            trans = COMMDB.getDBTrances();  //代码相同,这个也是打开一个事物,在同一个线程中,将会用同一个事务            if (trans != null) {                System.out.println(Thread.currentThread().getName() + ""|trans is open"");                trans.setThreadTrans();            }            String sql = ""update testdb set value = value + 1"";            for (int i = 0; i < 1000; i++) {                System.out.println(Thread.currentThread().getName() + ""(""+i+"")"");                COMMDB.executeUpdate(sql);            }            if (trans != null) {                System.out.println(Thread.currentThread().getName() + ""|trans is close"");                TransDBOper.closeThreadTrans(true);//这个相当于关闭事务并commit            }        } catch (Exception e) {            e.printStackTrace();        }    }}我想着这种情况下,数据库一定会因为事务脏数据问题而被写错。但事实不是这样,而是好好的,数据库结果是正确的加了2000次我检查一下打印结果,如下:begin db...

Thread-0|trans is open
Thread-1|trans is open
Thread-1(0)
Thread-0(0)
Thread-0(1)
Thread-0(2)
Thread-0(3)
....
Thread-0(991)
Thread-0(992)
Thread-0(993)
Thread-0(994)
Thread-0(995)
Thread-0(996)
Thread-0(997)
Thread-0(998)
Thread-0(999)
Thread-0|trans is close
Thread-1(1)
Thread-1(2)
...
Thread-1(993)
Thread-1(994)
Thread-1(995)
Thread-1(996)
Thread-1(997)
Thread-1(998)
Thread-1(999)
Thread-1|trans is close
可见,我的程序是没有做同步的,但序号是如此的正确。跟做了同步的一样。
我猜猜是数据库一个事务里头对一个表做了更改,那么这个事务只要没结束,
其他事务会被暂时性的挂起。
我不清楚是否是这样,结合mysql的事务的四个事务隔离级别,求高手解释一下这个现象。

解决方案

mysql的事务是可重复读的隔离级别 同时通过mvcc来防止幻读

时间: 2024-09-11 22:05:12

mysql 事务 线程-mysql事物隔离的问题,求大神指教的相关文章

Eclipse中代码要无法连接mysql数据库,求大神指教

问题描述 Eclipse中代码要无法连接mysql数据库,求大神指教 结果显示是这样:Exception in thread ""main"" java.lang.ClassNotFoundException: com.mysql.jdbc.Driver at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Meth

数据库-关于原生mysql语句多表查询更新字段问题 求大神解答

问题描述 关于原生mysql语句多表查询更新字段问题 求大神解答 如题:a表user_id school_id1233 220132346 220172344 234452247 22017... ... b表user_id term2346 12346 12346 22247 21233 1... ... 如上两张表:根据a表中的school_id=22017 得到它的user_id 然后根据此user_id得到b表中的term 并把term=1的变为term=2,把term=2的变为term

java-Java线程的问题~求大神指教

问题描述 Java线程的问题~求大神指教 一个Java类当中如果没有继承Thread或者实现Runnable接口的话是不是只会创建一个线程?? 如果一个java文件当中包含了两个类会创建几个线程? 解决方案 都是一个线程,一个java文件可以包含多个类但只有一个是public的,该类为主类.调用该类的方法也是从主类开始调用. 解决方案二: 通俗来说一个线程,也就是main函数主线程:但严格来说有两个线程,还有一个GC(垃圾回收)线程 解决方案三: 包含了两个类,就不一定了,首先会有一个主线程,也

如何用java线程池和socket实现群聊和私聊,求大神指教

问题描述 如何用java线程池和socket实现群聊和私聊,求大神指教 刚学习完javaSE,需要做一个小小的聊天软件,需要实现私聊和群聊的功能:本人觉得应当使用线程池和socket.IO流来实现,但不知道怎么做?求各位大神给点意见,不胜感激~ 解决方案 http://download.csdn.net/detail/z344310362/7579373 解决方案二: 群聊就是把消息发到一个聊天室,,私聊直接通过服务端发送给个人就行了 解决方案三: 我给你一个java聊天软件的参考吧:java聊

mysql数据库备份,备份有问题,求大神指点

问题描述 publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}#region备份privatevoidbutton1_Click(objectsender,EventArgse){if(MessageBox.Show("是否进行数据库备份?","标题",MessageBoxButtons.OKCancel,MessageBoxIcon.Question)==DialogResult.OK

线程-Android Studio跑程序的时候报错了 求大神指教!!

问题描述 Android Studio跑程序的时候报错了 求大神指教!! 02-29 21:27:52.770 13264-13270/com.example.cms.yibujiazai E/jdwp: Failed sending reply to debugger: Broken pipe 02-29 21:27:52.820 13264-13264/com.example.cms.yibujiazai W/dalvikvm: VFY: unable to find class refer

mysql 连接数好几千 大神指教

问题描述 mysql 连接数好几千 大神指教 请教个问题 我原来 mysql的服务器 是64G内存 平时 看连接数的话 基本保持几百个左右. 现在改成了8G内存. 为什么连接数是几千 但是 都是sleep的 如果是处理不过来 应该是很多并发处理的线程啊 但是都是sleep的 应该就是处理的过来 那为啥这么多connection 还都是sleep show PROCESSLIST 我连mysql的 是十几个tomcat,用的spring 解决方案 程序里连接没有关闭? 解决方案二: 通过show

数据-mysql中的事务处理,请大神指教

问题描述 mysql中的事务处理,请大神指教 假如我已经用了START TRANSACTION开启事务后,在ROLLBACK之前,我删除了表中的数据,然后SELECT,表中的数据已经空的了,当执行ROLLBACK后,数据又回来了,那么,DELETE后到ROLLBACK前,数据是存在缓存里面的吗? 解决方案 是的,否则无法回滚的 解决方案二: MySQL事务处理c++与mysql中的事务处理mysql事务处理

求大神帮我分析分析mysql的错误日志

问题描述 求大神帮我分析分析mysql的错误日志 2016-02-17 08:42:20 5388 [Note] Plugin 'FEDERATED' is disabled. 2016-02-17 08:42:20 1828 InnoDB: Warning: Using innodb_additional_mem_pool_size is DEPRECATED. This option may be removed in future releases, together with the o