`
Donald_Draper
  • 浏览: 952193 次
社区版块
存档分类
最新评论

mysql 事务处理

阅读更多
创建表:
CREATE TABLE `role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=40006 DEFAULT CHARSET=utf-8;


创建存储过程:

每次执行插入,提交一次
DELIMITER $$
CREATE PROCEDURE load0(count INT UNSIGNED,iname varchar(50),iage INT)
BEGIN
DECLARE s INT UNSIGNED DEFAULT 1;
START TRANSACTION;
WHILE s<count DO
INSERT INTO role(name,age)VALUES(iname,iage);
SET s=s+1;
COMMIT;
END WHILE;
END$$
DELIMITER ;


跟load0,没有什么区别因为mysql默认开启自动提交
DELIMITER $$
CREATE PROCEDURE load1(count INT UNSIGNED,iname varchar(50),iage INT)
BEGIN
DECLARE s INT UNSIGNED DEFAULT 1;
START TRANSACTION;
WHILE s<count DO
INSERT INTO role(name,age)VALUES(iname,iage);
SET s=s+1;
END WHILE;
END$$
DELIMITER ;


所有插入一次提交:
DELIMITER $$
CREATE PROCEDURE load2(count INT UNSIGNED,iname varchar(50),iage INT)
BEGIN
DECLARE s INT UNSIGNED DEFAULT 1;
START TRANSACTION;
WHILE s<count DO
INSERT INTO role(name,age)VALUES(iname,iage);
SET s=s+1;
END WHILE;
COMMIT;
END$$
DELIMITER ;


执行存储过程:
call load0(10000,'jack',23);
[SQL]call load0(10000,'jack',23);

受影响的行: 0
时间: 26.520s
truncate table role;
[SQL]call load1(10000,'jack',23);

受影响的行: 1
时间: 0.483s
mysql> select * from information_schema.INNODB_TRX;
+--------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+
| trx_id | trx_state | trx_started         | trx_requested_lock_id | trx_wait_started | trx_weight | trx_mysql_thread_id | trx_query | trx_operation_state | trx_tables_in_use | trx_tables_locked | trx_lock_structs | trx_lock_memory_bytes | trx_rows_locked | trx_rows_modified | trx_concurrency_tickets | trx_isolation_level | trx_unique_checks | trx_foreign_key_checks | trx_last_foreign_key_error | trx_adaptive_hash_latched | trx_adaptive_hash_timeout | trx_is_read_only | trx_autocommit_non_locking |
+--------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+
| 27177  |[color=red] RUNNING[/color]   | [color=red]2016-07-29 15:53:43[/color] | NULL                  | NULL             |      10000 |                  21 | NULL      | NULL                |                 0 |                 0 |                1 |                   360 |               0 |              9999 |                       0 | REPEATABLE READ     |                 1 |                      1 | NULL                       |                         0 |                     10000 |                0 |                          0 |
+--------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+

我的计算机时间已经15:56了,事务还没有结束,前台调用存储过程虽然返回快,但后台事务还在运行
truncate table role;
call load2(10000,'jack',23);
[SQL]call load2(10000,'jack',23);

受影响的行: 0
时间: 0.462s
select * from information_schema.INNODB_TRX;

查看事务表为空;

从以上三个可以分析出,load0的执行时间较长,这是由于,每次提交,mysql都要写重做日志redo(ib_logfile0,1oad1虽然时间前台时间不长,但事务在后台运行,load3由于只做一次重做日志所以很快,当然我们是建议,不要在循环中事务提交,而是待所有语句执行完一起提交,最好不要在存储过程中开启事务,因为如果发生回滚,不知道出现什么错误,最好在代码中控制
如下:
try{
con.setautocommint(false)
con.commit();
}
catch(SQLException e){
con.rollback();
}


分享到:
评论

相关推荐

    PHP事务处理实例 mysql事务处理的意义

    mysql事务处理的意义 事务处理机制在程序开发过程中有着非常重要的作用,它可以使整个系统更加安全,例如在银行处理转账业务时,如果A账户中的金额刚被发出,而B账户还没来得及接收就发生停电,这会给银行和个人带来...

    nodejs + mysql 事务处理问题

    nodejs + mysql 事物处理问题 呵呵 看了就知道 记得npm install啊 需要的东西啊 本想免费 苦于没积分 ,需要的的同学,给点分吧

    mySQL事务处理

    关于mysql的事务处理 public static void StartTransaction(Connection con, String[] sqls) throws Exception { if (sqls == null) { return; } Statement sm = null; try { // 事务开始 System....

    mysql事务处理用法与实例详解

    mysql事务处理用法与实例详解

    Java实现的mysql事务处理操作示例

    主要介绍了Java实现的mysql事务处理操作,结合实例形式较为详细的分析了Java基于JDBC操作mysql数据库实现事务处理的相关概念、操作技巧与注意事项,需要的朋友可以参考下

    mysql 事务处理学习资料+示例说明

    mysql 事务处理学习资料,带有示例说明

    MySQL事务处理与并发访问.pdf

    MySQL事务处理与并发访问.pdf

    mysql事务处理[归类].pdf

    mysql事务处理[归类].pdf

    MySQL事务处理详细讲解及完整实例

    MySQL事务处理详细讲解及完整实例下载 ..

    php实现mysql事务处理的方法

    本文实例讲述了php实现mysql事务处理的方法。分享给大家供大家参考。具体分析如下: 要实现本功能的条件是环境 mysql 5.2 /php 5 支持事务的table 类型,需要InnoDB,有了这些条件你就可以做上面的实现了,这个事物回滚...

    Mysql事务处理详解

    一、Mysql事务概念  MySQL 事务主要用于处理操作量大,复杂度高的数据。由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。在 MySQL 中只有使用了 Innodb 数据库引擎的...

    php下pdo的mysql事务处理用法实例

    本文实例讲述了php下pdo的mysql事务处理用法。分享给大家供大家参考。具体分析如下: php+mysql事务处理的几个步骤: 1.关闭自动提交 2.开启事务处理 3.有异常就自动抛出异常提示再回滚 4.开启自动提交 注意:mysql...

    mysql事务处理用法与实例代码详解

    主要介绍了mysql事务处理用法与实例代码详解,详细的介绍了事物的特性和用法并实现php和mysql事务处理例子,非常具有实用价值,需要的朋友可以参考下

    MySql事务处理.pdf

    。。。

    MySql事务处理.docx

    ...

    PHP+MySQL高并发加锁事务处理问题解决方法

    主要介绍了PHP+MySQL高并发加锁事务处理问题解决方法,结合实例形式分析了PHP+MySQL事务处理相关操作技巧与注意事项,需要的朋友可以参考下

    MySQL事务处理与应用简析

    事务处理在各种管理系统中都有着广泛的应用,比如人员管理系统,很多同步数据库操作大都需要用到事务处理。这篇文章主要介绍了MySQL事务处理,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics