本人有一个需求,就是我们有一个数据库,但是有多个server对其同时进行修改访问。
问如何做好同步?mysql里面有个LOCK TABLE,这么做是否合适呢?存储过程是否支持同步?mysql的BEGIN...END语句中是否是自动事务的?不是吧?事务呢?假如我开启了一个事务,正在执行语句中,此时数据库被另外的server修改了。那么事务提交的时候会不会失败?还是事务进行中,其他server就无法访问此表?还是事务和LOCK TABLE一起使用?你们又是怎么做同步的呢?或者介绍一些相关的书籍或者资料?感激不尽

解决方案 »

  1.   

    默认情况下单条sql是一个事务这个事务假如是修改数据,会加一个排他锁,以防止别的事务再使用该条数据
      

  2.   

    默认情况下单条sql是一个事务这个事务假如是修改数据,会加一个排他锁,以防止别的事务再使用该条数据
      

  3.   

    没什么不合适的。可以使用这个LOCK你的同步是指什么?信号互斥? 存储过程本身只是个代码的容器,关键看你的代码。
    当然能,前提是你的设置需要正确,比如你不能在MYISAM表中启用事务。如果你正确的启用了事务,那么回答“是” 其它SERVER无法修改这个表。不需要同步在数据库领域是一个术语,它的含义和你所指的完全不同。所以提问的时候千万不要用“术语”
    MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
      

  4.   


    据我所知,lock的主要优势是不是优化数据插入呢?你用lock做过数据同步的操作吗?
    如果这个事务操作包含了3个表,同时有另外一个server也操作这三个表,结果是这两个事务都成功了,数据是其中一个事务的。还是其中一个事务会COMMIT失败?好像没有COMMIT失败这么一说吧
    因为事务处理只是取了当前的一个快照啊。
    同步这个术语我想大家都明白。
      

  5.   

    如果我使用存储过程,是不是多个server处理,数据就有可能乱?
      

  6.   

    本人有一个需求,就是我们有一个数据库,但是有多个server对其同时进行修改访问。
    你这个 不是同步吧,而是多个server修改数据, 保证数据的完整性问题吧
      

  7.   

    如果你使用MYISAM,那别无选择,只能使用LOCK TABLE, 具体你可以先看一下手册中的说明,然后再讨论。
      

  8.   

    第一个事务对对表加锁,直到事务结束才会释放这些锁。所以说不是 “这两个事务都成功了” 只会有一个事务成功如是两个事务有冲突的话。 如果一个事务中需要操作A,B,C三个表,当事务1UPDATE A表事,事务2就无法进行,会直接ROLLBACK。
      

  9.   

     这问题不是这样描述的吧,
      一般mysql 服务器 就自动会给你进行添加 一些 锁机制的,    如果某一个server正在尝试修改某条数据,而另外一个也要对它进行数据修改 ,  这时候 后来的那个就必须得到前面那个修改完之后 释放掉这条数据的锁之后 ,它才可以操作的, 
      

  10.   

    查了一下,是不是我每个事务都做成这样
    SET AUTOCOMMIT = 0
    LOCK TABLES t1 WRITE// do somethingCOMMIT;
    UNLOCK TABLES;这样就会使数据完整了?
    我现在还不是很明白他那个SELECT...FOR UPDATE和SELECT ... LOCK IN SHARE MODE用的人是否很多?
    那个文档翻译的优点苦涩。那个多间隔尺寸锁定有没有一个比较详细的解释?
    ROLLBACK不是得手动调用吗????
      

  11.   

    不是,但出现错误或者异常,会自动回滚。
    当出错锁冲突时,另一个事务会等待,如果长时得到不锁,则会异常回滚。如果是INNODB,则不需要LOCK TABLE,事务本身就会去试图加锁。
      

  12.   

    关于锁方面的知识,http://book.51cto.com/art/200803/68118.htm 这里讲的很详情,不妨去看下.
      

  13.   

    还有一个问题,就是写存储过程的时候,我看很多人这样
    CALL t(@a)
    然后再
    SELECT @a
    来获取返回值
    为什么不直接把SELECT这个放在储存过程中呢?
    这样我们直接CALL t()的时候,直接就相当于CALL t(@a) & SELECT @a。
    why?
      

  14.   

    2.并发事务处理带来的问题相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从而可以支持更多的用户。但并发事务处理也会带来一些问题,主要包括以下几种情况。·更新丢失(Lost Update):当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题--最后的更新覆盖了由其他事务所做的更新。例如,两个编辑人员制作了同一文档的电子副本。每个编辑人员独立地更改其副本,然后保存更改后的副本,这样就覆盖了原始文档。最后保存其更改副本的编辑人员覆盖另一个编辑人员所做的更改。如果在一个编辑人员完成并提交事务之前,另一个编辑人员不能访问同一文件,则可避免此问题。
    好,这个文章不错,我疑惑的就是这个,我先研究一下
      

  15.   


    尽管很多都是Mysql文档的东西,但是mysql翻译的那个确实有点苦涩。呵呵