帮同学写的一个网站,里面涉及到订单操作,如何锁定订单!当一个管理员操作订单时,其他管理员无法对其操作,防止脏写!

解决方案 »

  1.   

    这个要看你需要什么样的“锁定”。如果你是希望在“写入数据库”的瞬间进行锁定,避免并发交叉写数据导致的脏数据,那当然就是用数据库的“事务”了。不过我猜你可能需要的不是这个。如果你是希望在一个用户填写表单的一段时间里确保不让另外的用户对相关的数据进行修改,那你可以考虑像 Visual SourceSafe 那样,定义一对 check-out / check-in 操作。就是说,在数据库里为“订单”数据定义一个状态字段,一个用户要修改订单的话,要先 check-out,从而阻止其他用户进行 check-out,如果不能成功执行 check-out 动作的话,就不允许其进行修改/提交操作。等他修改完提交的时候,相应地做 check-in 操作。这种做法的一个问题是,如果一个用户 check-out 之后,不再进行后续的操作(比如下班了、出差了、离职了),那这个订单将会一直处于锁定状态。为解决这个问题,还要实现相应的“管理员解锁”功能。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  2.   

    这个问题其实就是数据库事务中的锁问题,要看你要求的级别是什么程度,例如表级别、行级别等等,参考:20.1 MySQL锁概述第20章 锁问题锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。本章我们着重讨论MySQL锁机制的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议。20.1 MySQL锁概述相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。MySQL这3种锁的特性可大致归纳如下。·表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。·行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。·页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。 从上述特点可见,很难笼统地说哪种锁更好,只能就具体应用的特点来说哪种锁更合适!仅从锁的角度来说:表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。这一点在本书的“开发篇”介绍表类型的选择时,也曾提到过。下面几节我们重点介绍MySQL表锁和InnoDB行锁的问题,由于BDB已经被InnoDB取代,即将成为历史,在此就不做进一步的讨论了。
      

  3.   

    mysql锁表和解锁语句如果想要在一个表上做大量的 INSERT 和 SELECT 操作,但是并行的插入却不可能时,可以将记录插入到临时表中,然后定期将临时表中的数据更新到实际的表里。可以用以下命令实现:
    mysql> LOCK TABLES real_table WRITE, insert_table WRITE;mysql> INSERT INTO real_table SELECT * FROM insert_table;mysql> TRUNCATE TABLE insert_table;mysql> UNLOCK TABLES;InnoDB 使用行级锁,BDB 使用页级锁。对于 InnoDB 和 BDB 存储引擎来说,是可能产生死锁的。这是因为 InnoDB 会自动捕获行锁,BDB 会在执行 SQL 语句时捕获页锁的,而不是在事务的开始就这么做。行级锁的优点有:
    在很多线程请求不同记录时减少冲突锁。事务回滚时减少改变数据。使长时间对单独的一行记录加锁成为可能。行级锁的缺点有:
    比页级锁和表级锁消耗更多的内存。当在大量表中使用时,比页级锁和表级锁更慢,因为他需要请求更多的所资源。当需要频繁对大部分数据做 GROUP BY 操作或者需要频繁扫描整个表时,就明显的比其它锁更糟糕。使用更高层的锁的话,就能更方便的支持各种不同的类型应用程序,因为这种锁的开销比行级锁小多了。表级锁在下列几种情况下比页级锁和行级锁更优越:
    很多操作都是读表。在严格条件的索引上读取和更新,当更新或者删除可以用单独的索引来读取得到时:
    UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;DELETE FROM tbl_name WHERE unique_key_col=key_value;SELECT 和 INSERT 语句并发的执行,但是只有很少的 UPDATE 和 DELETE 语句。很多的扫描表和对全表的 GROUP BY 操作,但是没有任何写表。表级锁和行级锁或页级锁之间的不同之处还在于:将同时有一个写和多个读的地方做版本(例如在MySQL中的并发插入)。也就是说,数据库/表支持根据开始访问数据时间点的不同支持各种不同的试图。其它名有:时间行程,写复制,或者是按需复制。
     
      

  4.   

    简单的方法1 建立个字段,记录该记录正在被那个管理员查看(以下举例为该字段记录正在查看的管理员ID),并记录一个全局变量,记录所有在线的管理员ID,并定期刷新,以方便最后清除超时的管理员退出事件2 管理员查看指定的记录时,先将所有记录中,取消掉该管理员的ID,然后将该记录中写入管理员ID,表示这个管理员正在查看该记录3 如果想设置为只能1人读取,则在显示时判断该记录的管理员ID是否为当前的管理员ID,如不是则禁止查看4 如果想设置为只能1人同时修改,则在保存修改结果时判断该管理员ID是否为当前管理员ID,如不是则禁止修改5 管理员退出后清空该表内的管理员锁定字段的信息