Commit d2d4b488 authored by unknown's avatar unknown
Browse files

Fixed BUG #6747: innodb_locks_unsafe_for_binlog still uses next-key locking.


innobase/row/row0sel.c:
  Fixed bug: innodb_locks_unsafe_for_binlog still uses next-key locking (BUG #6747).
  We do not take gap type locks when using InnoDB startup option 
  innodb_locks_unsafe_for_binlog. Some code polishing also done.
parent 6d6b38c2
Loading
Loading
Loading
Loading
+72 −62
Original line number Diff line number Diff line
@@ -642,16 +642,17 @@ row_sel_get_clust_rec(
		we lock only the record, i.e. next-key locking is
		not used.
		*/
	  if ( srv_locks_unsafe_for_binlog )
	    {
		err = lock_clust_rec_read_check_and_lock(0, clust_rec, 
                        index,node->row_lock_mode, LOCK_REC_NOT_GAP, thr);
	    }
	  else
	    {		
		err = lock_clust_rec_read_check_and_lock(0, clust_rec, index,
				node->row_lock_mode, LOCK_ORDINARY, thr);

		if (srv_locks_unsafe_for_binlog) {
			err = lock_clust_rec_read_check_and_lock(0, 
					clust_rec, 
					index, node->row_lock_mode, 
					LOCK_REC_NOT_GAP, thr);
		} else {
			err = lock_clust_rec_read_check_and_lock(0, 
					clust_rec, 
					index, node->row_lock_mode, 
					LOCK_ORDINARY, thr);
		}

		if (err != DB_SUCCESS) {
@@ -1210,16 +1211,18 @@ row_sel(
			not used.
			*/

                  if ( srv_locks_unsafe_for_binlog )
		    {
			err = sel_set_rec_lock(page_rec_get_next(rec), index,
				node->row_lock_mode, LOCK_REC_NOT_GAP, thr);
		    } 
                    else
		    {
			err = sel_set_rec_lock(page_rec_get_next(rec), index,
				node->row_lock_mode, LOCK_ORDINARY, thr);
			if (srv_locks_unsafe_for_binlog) {
				err = sel_set_rec_lock(page_rec_get_next(rec), 
							index,
							node->row_lock_mode,
							LOCK_REC_NOT_GAP, thr);
			} else {
				err = sel_set_rec_lock(page_rec_get_next(rec), 
							index,
							node->row_lock_mode, 
							LOCK_ORDINARY, thr);
			}

			if (err != DB_SUCCESS) {
				/* Note that in this case we will store in pcur
				the PREDECESSOR of the record we are waiting
@@ -1250,13 +1253,10 @@ row_sel(
		not used.
		*/

                  if ( srv_locks_unsafe_for_binlog )
		    {
		if (srv_locks_unsafe_for_binlog) {
			err = sel_set_rec_lock(rec, index, node->row_lock_mode,
						LOCK_REC_NOT_GAP, thr);
		    } 
		  else
		    {
		} else {
			err = sel_set_rec_lock(rec, index, node->row_lock_mode,
						LOCK_ORDINARY, thr);
		}
@@ -3209,8 +3209,7 @@ row_search_for_mysql(
			we do not lock gaps. Supremum record is really
			a gap and therefore we do not set locks there. */
			
			if ( srv_locks_unsafe_for_binlog == FALSE )
			{
			if (srv_locks_unsafe_for_binlog == FALSE) {
				err = sel_set_rec_lock(rec, index,
						prebuilt->select_lock_type,
						LOCK_ORDINARY, thr);
@@ -3312,11 +3311,18 @@ row_search_for_mysql(

			if (prebuilt->select_lock_type != LOCK_NONE
		    	    && set_also_gap_locks) {
				/* Try to place a lock on the index record */

				/* Try to place a gap lock on the index 
				record only if innodb_locks_unsafe_for_binlog
				option is not set */

				if (srv_locks_unsafe_for_binlog == FALSE) { 

					err = sel_set_rec_lock(rec, index,
						prebuilt->select_lock_type,
						LOCK_GAP, thr);
				}

				if (err != DB_SUCCESS) {

					goto lock_wait_or_error;
@@ -3338,11 +3344,18 @@ row_search_for_mysql(
			
			if (prebuilt->select_lock_type != LOCK_NONE
			    && set_also_gap_locks) {
				/* Try to place a lock on the index record */	

				/* Try to place a gap lock on the index 
				record only if innodb_locks_unsafe_for_binlog
				option is not set */

				if (srv_locks_unsafe_for_binlog == FALSE) {

					err = sel_set_rec_lock(rec, index,
						prebuilt->select_lock_type,
						LOCK_GAP, thr);
				}

				if (err != DB_SUCCESS) {

					goto lock_wait_or_error;
@@ -3378,16 +3391,13 @@ row_search_for_mysql(
		} else {
			/* If innodb_locks_unsafe_for_binlog option is used, 
			we lock only the record, i.e. next-key locking is
                           not used.
	                */
	                if ( srv_locks_unsafe_for_binlog )
	                {
			not used. */

			if (srv_locks_unsafe_for_binlog) {
				err = sel_set_rec_lock(rec, index,
						prebuilt->select_lock_type,
						LOCK_REC_NOT_GAP, thr);
			}
			else
			{
			} else {
				err = sel_set_rec_lock(rec, index,
						prebuilt->select_lock_type,
						LOCK_ORDINARY, thr);